2013-12-14 31 views
0

我需要显示一个循环ProgressBar,直到3个AsynchTasks完成。如何在3个AsynchTasks完成后隐藏ProgressBar并显示ListView

我无法达到结果。

请任何帮助表示赞赏。

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> 

回答

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(); 

     } 
0

你也许有要执行的任务数初始化的计数器。计数器在asyncTask完成时递减,并且progressBar在计数器= 0时被解除。然后您可以检查每个asyncTask的完成情况,并在onPostExecute中执行计数器中的递减,进度条解除等操作为每个asyncTasks

0

如果三的AsyncTask完成,例如这种方法,你可以创建方法将被调用时,每对交3个的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(); 
    } 
0

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

您需要让代码隐藏进度条和显示列表,只调用一次,并在最后一个AsyncTask完成后显示。

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

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

便笺: 如果您希望将此行为扩展到可以随时运行的任务,而不是使用像3这样的预设值,那么需要另一个计数,在任务开始时以及在方法中检查if开始的任务数量等于完成的任务数量。

0

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

runOnUiThread(new Runnable() { 

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