2013-06-21 110 views
0

我需要顯示progrees對話框。這很簡單,但我絕對需要等待直到asynctask完成。這給我帶來了一些困難。等待完成asynctask方法.get()被使用。但是這個方法blocks我的進度對話框。 那麼,如何取消阻止progressdialog獲取或可以取代.get()disparying progressdialog的困難

我在以下方法調用操作:

Operation o = new Operation(); 
o.execute(params); 
try { 
      o.get(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

類操作

class Operation extends AsyncTask<String, Void, JSONObject> { 
     ProgressDialog pd; 
     Context con; 

     @Override 
     protected void onPreExecute() { 
      pd = new ProgressDialog(app); 
      pd.setOwnerActivity(app); 
      pd.setTitle("Идет загрузка..."); 
      pd.setCancelable(true); 
      pd.show(); 
     } 

     @Override 
     protected JSONObject doInBackground(String... option) { 
      /* 
      some job 
      */ 

      return json; 
     } 

     @Override 
     protected void onPostExecute(JSONObject result) { 
      super.onPostExecute(result); 
      pd.dismiss(); 

      /* 
      some job 
      */ 
     } 
    } 
+1

在onPreExecute和隱藏在onPostExecute中顯示的問題是什麼? – stinepike

+0

忘記刪除評論。 .get()被調用時,preexecute/postexecute - dialog的問題不會彈出。在這種情況下,asynctask完成後對話框會閃爍半秒。 – Yarh

+0

你可以調用doInBackground中的get方法 – stinepike

回答

1

不要使用.get()因爲你已經看到它阻止UI。如果您需要檢查任務是否完成,您可以使用getStatus()。刪除.get()應允許您的ProgressDialog顯示。如果你有一些代碼必須等到AsyncTask完成,然後把它放在onPostExecute()或調用一個函數從那裏

如果您需要從AsyncTask完成任務後引用一些在MainActivity,只需創建一個構造帶和你的Activity的引用傳遞contextconstructor

Operation o = new Operation(this); 

並在構造函數中引用它

lass Operation extends AsyncTask<String, Void, JSONObject> { 
    ProgressDialog pd; 
    Context con; 
    Activity act; 

    public Operator(Activity curAct) 
    { 
     act = curAct; // can use this reference to access methods in your Activity 
    } 
+0

聽起來不錯。但是,我可以把另一個asynctaks放在第一個asynctask的postExecute()上嗎? .get()的神祕性引發了,因爲我給了幾個網絡操作,其中的網絡調用下載選項用於下一個操作。 – Yarh

+0

是的,你可以做到這一點 – codeMagic

1

嘗試使用這種方法

private ProgressDialog dialog=null; 

    @Override 
      protected void onPreExecute() { 
       dialog = ProgressDialog.show(this, "", "Please! Wait...",true); 
      } 


      @Override 
      protected void onPostExecute(JSONObject result) { 
       super.onPostExecute(result); 
       dialog.dismiss(); 
       // use here code 
      } 
1

您可能想要將您的代碼更改爲這樣的東西。 將之後要運行的代碼封裝在可運行的程序中,並將其傳遞給異步任務。

Runnable onEnd = new Runnable(){ 
    //code to run after the task has completed 
} 
Operation o = new Operation(onEnd); 
o.execute(params); 

這裏是修改後的操作類。

class Operation extends AsyncTask<String, Void, JSONObject> { 
    ProgressDialog pd; 
    Context con; 
    Runnable afterwards = null; 

    Operation(Runnable afterwards){ 
     this.afterwards = afterwards ; 
    } 

    @Override 
    protected void onPreExecute() { 
     pd = new ProgressDialog(app); 
     pd.setOwnerActivity(app); 
     pd.setTitle("Идет загрузка..."); 
     pd.setCancelable(true); 
     pd.show(); 
    } 

    @Override 
    protected JSONObject doInBackground(String... option) { 
     /* 
     some job 
     */ 

     return json; 
    } 

    @Override 
    protected void onPostExecute(JSONObject result) { 
     super.onPostExecute(result); 
     pd.dismiss(); 

     /* 
     some job 
     */ 
     if (afterwards != null) 
      afterwards.run(); 
    } 
} 

注意afterwards.run()onPostExecute