2012-07-25 71 views
1

在我的應用程序中,當我點擊按鈕時,它有時會顯示progressdialog,有時不會顯示clickd按鈕上的progressdialog。異步任務不顯示按鈕上點擊事件的進度對話框

異步任務的代碼是:

public class LoadData extends AsyncTask<Void, Void, Void> 
    { 
     ProgressDialog pd; 
     @Override 
     protected void onPreExecute() 
     { 
      pd = ProgressDialog.show(MainActivity.this, "", "Loading..."); 
     } 
     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      MainActivity.this.runOnUiThread(new Runnable() { 

       public void run() { 
        // TODO Auto-generated method stub 
        LoadActivities(); // function to load data from url 

       } 
      }); 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void unused) 
     { 
      pd.dismiss();  
     } 

    } 

和按鈕單擊事件稱此爲:

btn.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     new LoadMoreData().execute(null); 
    } 
}); 
+0

現在問題是progressdialog會在一段時間後打開,而不是單擊事件之後。 – Sats 2012-07-25 09:06:38

回答

3

錯誤的思考你正在做的是在doInBackground你使用runOnUiThreade。只是從你的代碼中刪除。它解決了你的問題。

從不在doInBackground中使用任何線程。

1

爲什麼你已經採取再次運行方法doInBackground,doInBackground方法上進行運算後臺線程,所以沒必要拿runOnUiThread

 MainActivity.this.runOnUiThread(new Runnable() { 

      public void run() { 
       // TODO Auto-generated method stub 
       LoadActivities(); // function to load data from url 

      } 
     }); 

只要寫

protected Boolean doInBackground(final String... args) { 
     try { 
      LoadActivities(); 
      return true; 
     } catch (Exception e) { 
      Log.e("tag", "error", e); 
      return false; 
     } 
    } 

,改變new LoadMoreData().execute();不寫空

   btn.setOnClickListener(new View.OnClickListener() {  
       public void onClick(View v) { 
         new LoadMoreData().execute(); 
       }}); 
0

Nirali的答案似乎是正確的,只是爲了進一步的解釋和一些編輯。 進程對話框將在doInBackground方法返回值時顯示。在你的代碼,它只是創建另一個線程,並完成執行,所以在時間LoadActivities exectues顯示進度對話框,在同一個線程執行該語句doInBackground執行,所以更改爲以下幾點:

@Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      MainActivity.this.runOnUiThread(new Runnable() { 

      LoadActivities(); // function to load data from url 
      return null; 
     }