2013-10-04 97 views
2

AsyncTask樣子:等待publishProgress之前完成繼續EXCUTE doInBackground的AsyncTask的Android

private class MyTask extends AsyncTask<String, Void, List<Data>> { 
    private volatile UserData userData; 
    protected List<Data> doInBackground(String... params) { 
     // do some job 1 
     publishProgress(); 
     // wait until the progress finish to update variable. 
     if(userData!= null){ 
     //do some job 2 
     } 

     //do some job 3 

    } 

    protected void onProgressUpdate(Void... values) { 
     // try to ask user and collect information 
     userData= getData(); 
    } 

} 

問題是,當我打電話publishProgress(),但它仍然在doInBackground執行任務3。在繼續之前,我如何等待onProgressUpdate完成?

更新
在getData()方法,我試圖讓用戶的當前位置,即不能在doInBackground並從視圖中的一些其他信息工作。我必須這樣做,導致作業1需要很長時間,並且用戶的當前位置可以改變。我需要用戶的最確切位置。

+0

使用等待和通知,這就是他們的目的。 – njzk2

回答

2

我想,你正在使用doInBackground和publishProgress()的方式有些不妥,但我仍然需要看到方法代碼getData()

doInBackground方法應該是用來做一些任務,應在其他線程不是事件線程中執行,並在publishProgress方法,你應該執行與事件線程工作任務。所以,如果getData()與事件線程無關,請自行編寫代碼doInBackground

但是,如果你的要求,只需使用這兩種方法,如存在,那麼你可以添加一個同步塊,如象下面這樣:

private class MyTask extends AsyncTask<String, Void, List<Data>> { 
    private volatile UserData userData; 
    protected List<Data> doInBackground(String... params) { 

    synchronize(userData) 
    { 
     // do some job 1 
     publishProgress(); 
     // wait until the progress finish to update variable. 
     if(userData!= null){ 
     //do some job 2 
     } 

     //do some job 3 
    } 
    } 

    protected void onProgressUpdate(Void... values) { 
     // try to ask user and collect information 
     synchronize(userData) 
     { 
      userData= getData(); 
     } 
    } 

} 
+0

我已經更新了我的問題,我需要從getData()方法獲取位置數據。 – R4j

+0

jeet你還可以解釋一下volatile的使用和同步吧。我知道volatile對象可以被多個線程同時改變。同步(鎖定)意味着單線程可以在線程上工作。 – Nepster

0

使用標誌_publishFinished = false;然後調用發佈進度然後做忙等待在doInBackgrnd

`if(!_publishFinish) 
{Thread.Sleep(200);}` 

在 結束onProgressUpdate調用

_publisFinish = true; 
0
private class MyTask extends AsyncTask<String, Void, List<Data>>{ 


     protected void onPreExecute() { 
      // Showing progress dialog before sending http request 
      pDialog = new ProgressDialog(YourActivity.this); 
      pDialog.setMessage("Please wait.."); 
      pDialog.setIndeterminate(true); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 
    private volatile UserData userData; 
    protected List<Data> doInBackground(String... params) { 
     // do some job 1 
     publishProgress(); 
     // wait until the progress finish to update variable. 
     if(userData!= null){ 
     //do some job 2 
     } 

     //do some job 3 

    } 

    protected void onProgressUpdate(Void... values) { 
     // try to ask user and collect information 
     userData= getData(); 
    } 
    protected void onPostExecute(Void unused) { 
      // closing progress dialog 
      pDialog.dismiss(); 
     } 

} 

pDialog是你的進度對話框。從您的任何活動初始化如下:

ProgressDialog pDialog; 

這可能會幫助你。

相關問題