2011-11-24 77 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 ..你说得对。 –