2013-12-14 29 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) 
    } 
}