如何在3个AsynchTasks完成后隐藏ProgressBar并显示ListView

时间:2013-12-14 22:02:01

标签: android

在我的应用程序中,我需要显示一个循环的ProgressBar,直到3个AsynchTasks完成。

我无法达到结果。

请提供任何帮助。

public class MainActivity extends Activity {
public ArrayList<String> files=new ArrayList<String>();
public String mQuery=null;
public File root=Environment.getRootDirectory();
public ArrayAdapter<String> ad;
public ArrayList<String> queries= new ArrayList<String>(Arrays.asList(".prc",".mobi",".epub"));
public ProgressBar pb;
public  ListView lv;
public LinearLayout ll;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ll=(LinearLayout)findViewById(R.id.layout);
    pb =(ProgressBar)findViewById(R.id.progress);

    lv=(ListView)findViewById(R.id.listView1);
} 

protected void onResume(){
    super.onResume();
    ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
    lv.setAdapter(ad);

    for(int i=0;i<queries.size();i++){

        AddStringTask as= new AddStringTask();
        try {
            mQuery=queries.get(i);
            as.execute(Environment.getRootDirectory());

        } catch (Exception e) {
            e.printStackTrace();
        } 

    }
    //pb.setVisibility(View.GONE);
    lv.setVisibility(View.VISIBLE);
    for(int i1=0;i1<files.size();i1++){
        ad.add(files.get(i1));
    }

    ad.notifyDataSetChanged();


    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String path =(String) lv.getItemAtPosition(position);

            if((!path.endsWith(".prc"))) {
            Intent vi=new Intent();
            vi.setAction(Intent.ACTION_VIEW);

            vi.setData(Uri.parse("file://" +path));
            vi.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(vi);
            }

            if((path.endsWith(".prc"))) {
                String bookID=path.substring(path.length()-19, path.length()-9);
                Intent vi=new Intent();
                vi.setAction(Intent.ACTION_VIEW);

                Uri file = Uri.parse("kindle://book/?action=open&book_id=AMZNID0/" + bookID + "/0/");
                vi.setData(file);
                vi.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(vi);
                }
        }
    });

}

class AddStringTask extends AsyncTask<File, Void, Void> {

    @Override
    protected void onPreExecute(){
        pb.setVisibility(View.VISIBLE);
        //lv.setVisibility(View.INVISIBLE);

    }
    @Override
    protected Void doInBackground(File... root) {

        search(root[0]);

        return (null);
    }

    @Override
    protected void onProgressUpdate(Void... unused) {

    }

    @Override
    protected void onPostExecute(Void unused) {
        Toast.makeText(MainActivity.this, "DONE", Toast.LENGTH_LONG)
                .show();
        pb.setVisibility(View.GONE);
        lv.setVisibility(View.VISIBLE);
        ll.invalidate();
    }
}

这是我的XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
     >
</ListView>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center" >

    <ProgressBar
        android:id="@+id/progress"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

</LinearLayout>

5 个答案:

答案 0 :(得分:0)

您可能有一个计数器,初始化了您要执行的任务数。当asyncTask完成时计数器减少,并且一旦计数器= 0,progressBar被解除。你可以检查每个asyncTask的完成情况并在每个asyncTasks的onPostExecute中的计数器,进度条解雇等等。

答案 1 :(得分:0)

您可以创建在post执行时调用三个AsyncTask中的每一个时调用的方法,并且此方法检查三个AsyncTask是否已完成,例如此方法:

private void methodName ()
{
   if(task1 && task2 && task3)
   {
    //execute the code ... hide the progress bar
   }
}

在帖子上执行将是这样的:

    @Override
    protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    //AsyncTask one on post execute
        task1 == true;
        methodName();
    }

答案 2 :(得分:0)

如果我已正确理解您的问题和代码,您需要更改的内容是隐藏进度条并显示视图的方式。您的代码现在的方式将导致栏被隐藏,并且在每个AsyncTask完成后显示列表。

您需要让代码隐藏仅调用一次的进度条和显示列表,并将其保留在最后AsyncTask完成之后。

您可能会做的是在AsyncTask完成时增加静态AtomicInteger。然后,在完成每个任务时,调用一个方法来保存代码以隐藏进度条并显示列表。但是,如果提到的计数为3,则此方法仅执行此代码。

您可以通过使用接口来实现此目的,以允许任务在执行它的类中调用方法,如此answer中所述。或者您可以通过MainActivity中的静态方法来完成。

旁注: 如果您希望将此行为扩展到可以随时运行的任务,而不是使用预设值(如3),则在任务开始时再次计数增加,并在方法中检查启动的任务数是否等于完成的任务数量。

答案 3 :(得分:0)

    MaintringTask ms = new MaintringTask();
    ms.execute();

class MaintringTask extends AsyncTask<File, Void, Void> {
    @Override
    protected Void doInBackground(File... root) {
        for (int i = 0; i < queries.size(); i++) {

            AddStringTask as = new AddStringTask();
            try {
                mQuery = queries.get(i);
                as.execute(Environment.getRootDirectory()).get();

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        return (null);
    }

    @Override
    protected void onProgressUpdate(Void... unused) {
    }

    @Override
    protected void onPostExecute(Void unused) {
        for (int i1 = 0; i1 < files.size(); i1++) {
            ad.add(files.get(i1));
        }

        ad.notifyDataSetChanged();
        pb.setVisibility(View.GONE);
    }

    class AddStringTask extends AsyncTask<File, Void, Void> {
        @Override
        protected Void doInBackground(File... root) {
            search(root[0]);
            return (null);
        }

        @Override
        protected void onProgressUpdate(Void... unused) {
        }

        @Override
        protected void onPostExecute(Void unused) {
            Toast.makeText(MainActivity.this, "DONE", Toast.LENGTH_LONG)
                    .show();

        }

答案 4 :(得分:0)

请尝试解除UI线程中的进度条

 runOnUiThread(new Runnable() {

 @Override
 run(){
    progressbar.setVisibility(View.Gone)
     }
 }