2013-12-12 50 views
1

我在這個應用程序中有一個Asynctask,我在onPreExecute中有一個ProgressDialog。ProgressDialog不消除Asynctask的多個實例

ProgressDialog pDialog; 

    protected void onPreExecute() { 

     pDialog = new ProgressDialog(Synchronization.this); 
     pDialog.setMessage(Html.fromHtml("<b>Please Wait</b><br/>Working...")); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 

    } 

而且,在onPostExecute中,我關閉了這個對話框。

    protected void onPostExecute(ArrayList<Object> allShopsData) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(allShopsData); 

     final ArrayList<Object> allShops = allShopsData; 

     // dismiss the dialog after getting all products 
     if(pDialog!=null && pDialog.isShowing()) 
     pDialog.dismiss(); 

     // updating UI from Background Thread 
     runOnUiThread(new Runnable() { 
      public void run() { 
       ExpandableListView expandableList = (ExpandableListView) findViewById(R.id.expandlist); 

       expandableList.setDividerHeight(2); 
       expandableList.setGroupIndicator(null); 
       expandableList.setClickable(true); 

       MyExpandableAdapter adapter = new MyExpandableAdapter(taskList, 
         allShops); 

       adapter.setInflater(
         (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE), 
         Synchronization.ref); 
       expandableList.setAdapter(adapter); 

      } 
     }); 

    } 

我在同步(我的主要活動)onCreate()中啓動名稱爲'task1'的Asynctask。 現在,我在MainActivity中有一個菜單,我取消'task1'引用的Asynctask,並創建另一個Asynctask實例,將其分配給'task1'。

   task1.cancel(true); 
       task1 = new GetShopsTask(); 
       task1.execute(taskList); 

但在這裏,我看到創建了一個進度對話框onPostExecute後駁回(我還可以看到我的觀點在後臺更新),而是立即在此之後,另一進度對話框彈出不被擱置。 不確定,造成這一點的是什麼部分。有人可以幫忙嗎?

+1

我不知道這是造成你的問題,但請從'onPostExecute刪除'runOnUiThread'()'。由於'onPostExecute()'運行在'UI線程'上是不必要的,它可能導致問題/混亂 – codeMagic

+0

你在哪裏定義'ProgressDialog'?難道兩個'AsyncTask'會互相干擾,第二個會覆蓋第一個''pDialog''的引用嗎? – SimonSays

+0

codemagic-我剛剛從我的代碼中刪除了runOnUiThread,但仍然是相同的行爲。 – Armageddon

回答

2

問題是您取消AsyncTask時,onPostExecute未被調用,而是調用onCanceled()。請參閱AsyncTask源代碼。

private void finish(Result result) { 
     if (isCancelled()) { 
      onCancelled(result); 
     } else { 
      onPostExecute(result); 
     } 
     mStatus = Status.FINISHED; 
    } 

因此,您的進度對話框不會因爲onPostExecute從不被調用而關閉。您可以添加以下內容到異步任務解決問題:

 @Override 
     protected void onCancelled() 
     { 
      // dismiss the dialog on canceled task 
      if(pDialog!=null && pDialog.isShowing()) 
       pDialog.dismiss(); 
     } 
+0

完美!得到它與這工作。非常感謝!! – Armageddon