2011-11-24 78 views
1

我想使用警報對話框和異步任務的活動,正在以下錯誤警告對話框和異步任務

產生的原因:了java.lang.RuntimeException:無法裏面 創建處理程序線程已經不叫Looper.prepare()

代碼:

public class loginTask extends AsyncTask<Void, Void, Void> { 
    public ProgressDialog loginDialog = new ProgressDialog(
      LoginActivity.this); 

    @Override 
    protected void onPreExecute() { 
     loginDialog.setMessage("Please wait Logging in"); 
     loginDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     if(loginUser()) { 
      loginDialog.dismiss(); 
      alertbox("title", "winnn", "Okay"); 
     } else { 
      loginDialog.dismiss(); 
      alertbox("title", "message", "Okay"); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
     loginDialog.dismiss(); 
     Intent intentHome = new Intent(LoginActivity.this, 
       HomeActivity.class); 
     startActivity(intentHome); 
    } 
} 

回答

10

你不能直接在doInBackground()方法內更新UI。 (是的,如果你仍然要執行然後將相同的doInBackground()runOnUiThread()方法內),否則

,做到這一點的方法onPostExecute()裏面。

public class loginTask extends AsyncTask<Void, Void, Void> 
{ 
    public ProgressDialog loginDialog = new ProgressDialog(LoginActivity.this); 
    public Boolean flag; 

    @Override 
    protected void onPreExecute() { 
     loginDialog.setMessage("Please wait Logging in"); 
     loginDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     if(loginUser()) 
      flag = true; 
     else 
      flag=false; 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
     loginDialog.dismiss(); 

     if(flag) 
      alertbox("title", "winnn", "Okay"); 
     else 
      alertbox("title", "message", "Okay"); 
    } 
} 
+0

」您不能在doInBackground()方法內更新UI。「我們可以使用runOnUiThread()更新doInBackground()內部。 –

+0

@LalitPoptani它在你的評論之前的回答中已經提到:) –

+0

@PareshMayani ...如果我使用這段代碼,會發生什麼情況,當對話框顯示時我會改變方向? – Selvin

1

的onPreexecute和onPostExecute都在異步任務的UI部件的一部分。這doInBackground是一個單獨的線程,這樣需要progressUpdate

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 
的形式處理的doInBackground內作出的任何事情

示例參考:Link

反映您需要對doInBackground進程之間的UI進行的任何更改。 「

+0

他面臨doInBackground()顯示對話框的問題。 –

+1

是啊你的答案似乎不錯,所以我沒有任何擔憂。意向解決權 – medampudi

+0

@mdeampudi yeh ..你說得對。 –