2012-08-07 53 views
0

我有了類似這樣的代碼中的onCreate()一MapActivity:試圖顯示ProgressDialog中的AsyncTask在MapActivity執行

if(...) { 
    ... 
    new FirstAsyncTask(id, this).execute((Object[]) null); 
    ... 
} else { 
    ... 
    myLocationOverlay.runOnFirstFix(new Runnable() { 
     new SecondAsyncTask(lat, lon, ActivityName.this).execute((Object[]) null); 
    } 
    ... 
} 

的FirstAsyncTask和SecondAsyncTask都做不同的事情,但他們兩人秀一個ProgressDialog像這樣:

public FirstAsyncTask(long id, Context context) { 
    progressDialog = new ProgressDialog(context); 
} 

protected void onPreExecute() { 
    ... 
    progressDialog.show(); 
} 

protected String doInBackground(Object... params) { 
    ... 
    progressDialog.dismiss(); 
    ... 
} 

這正與FirstAsyncTask,但無論怎樣我在電話更改爲SecondAsyncTask它總是失敗,此錯誤:無法內螺紋已不叫Looper.prepare創建處理程序()。我曾嘗試將上下文參數設置爲「this」,「ActivityName.this」,getApplicationContext()和getBaseContext()。

我對Android仍然很陌生,所以這種「上下文」的想法讓我感到困惑。我更加困惑FirstAsyncTask工作,但SecondAsyncTask不工作。我發現在其他問題中提到了這個錯誤,但沒有一個答案似乎有效。有任何想法嗎?

編輯:在SecondSyncTask的構造函數中初始化ProgressDialog時引發異常。

回答

1

的問題是在這裏

myLocationOverlay.runOnFirstFix(new Runnable() { 
    new SecondAsyncTask(lat, lon, ActivityName.this).execute((Object[]) null); 
} 
正在建設一個新產生的線程

SecondAsyncTask 。而不是UI線程。

在活動中創建一個progressDialog。然後從Asynctasks訪問Activity的progressDialog。

public class MyActivity extends Activity { 
    ProgressDialog mProgressDialog; 

    onCreate(...){ 
     mProgressDialog = new ProgressDialog(); 
    } 

    private class MyAsyncTask extends AsyncTask<...> { 
     ... 
     onPreExecute(...){ 
      mProgressDialog.show(); 
     } 

     onPostExecute(...){ 
      mProgressDialog.dismiss(); 
     } 
    } 

    private class MyAsyncTask2 extends AsyncTask<...> { 
     ... 
     onPreExecute(...){ 
      mProgressDialog.show(); 
     } 

     onPostExecute(...){ 
      mProgressDialog.dismiss(); 
     } 
    } 

不要試圖執行從doInBackground progressDialog.dismiss(),而不是把它這是在UI線程中運行postExecute。

一旦所有這些工作都正常,您將需要設置標誌,以便只有在兩項任務完成後才解散progressdialog。

+0

謝謝,但這並不能解釋爲什麼其中一個工作正常,另一個不是。 – jebar8 2012-08-07 03:40:41

+0

這是因爲您正在向UI線程的不同線程構建progressdialog。你正在構建一個新線程產生的secondasynctask的構造函數。 – 2012-08-07 03:44:14

+0

這些AsyncTasks在應用中的多個活動中重複使用。他們沒有在這個活動中宣佈。 ProgressDialog在這個例子中只有一個問題。移動AsyncTask之外的對話是唯一的解決方法嗎? – jebar8 2012-08-07 03:47:31

1

寫您的對話解僱代碼中onPostExecute()方法會在UI線程運行的代碼

@Override 
protected void onPostExecute(Void result) { 
progressDialog.dismiss(); 
} 

寫您的AsyncTask類是這樣的:

private class FirstAsyncTask extends AsyncTask<String, Void, Void> { 

    ProgressDialog myDialog = null; 
@Override 
protected void onPreExecute() { 
myDialog = ProgressDialog.show(YourActivityClass.this, "", 
       "Loading Data..."); 
return; 
} 

@Override 
protected Void doInBackground(String... urls) { 
//Your code which you want to run in background 
return null; 
} 

@Override 
protected void onPostExecute(Void result) { 
myDialog.dismiss(); 
return; 
} 
} 

上面的代碼工作,如果你已經定義了AsyncTask類作爲Activity的內部類。如果您的AsyncTask類定義爲一個獨立的類,那麼你必須在活動的情況下傳遞給它的構造

ProgressDialog myDialog = null; 
Context context; 
public FirstAsyncTask (Context context) { 
    this.context = context;  
} 

@Override 
protected void onPreExecute() { 
myDialog = ProgressDialog.show(context, "", 
      "Loading Data..."); 
return; 
} 
+0

查看修改。之前應該提到這一點。問題是在構造函數中初始化ProgressDialog。 – jebar8 2012-08-07 03:38:37

+0

檢查我的編輯.. – Nishant 2012-08-07 03:45:10