04-21 12:49:16.689: ERROR/AndroidRuntime(2123): FATAL EXCEPTION: AsyncTask #1
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): java.lang.RuntimeException: An error occured while executing doInBackground()
04-21 12:49:16.689: ERROR/AndroidRuntime(2123):at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.lang.Thread.run(Thread.java:1019)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.os.Handler.<init>(Handler.java:121)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.widget.Toast.<init>(Toast.java:68)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.widget.Toast.makeText(Toast.java:23
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at com.microogle.dev.util.ServerConnections.PostToLoginPage(ServerConnections.java:36)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at com.microogle.dev.Whiteboard.WhiteboardLogin$LoginTask.doInBackground(WhiteboardLogin.java:150)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at com.microogle.dev.Whiteboard.WhiteboardLogin$LoginTask.doInBackground(WhiteboardLogin.java:1)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-21 12:49:16.689: ERROR/AndroidRuntime(2123): ... 4 more
其后是泄漏的窗口错误。我假设这是因为静态方法中传递给Toast的上下文出错。 AsyncTask是:
private class LoginTask extends AsyncTask<Void, Void, Void> {
private WhiteboardLogin activity;
private Context callingContext;
private ProgressDialog dialog;
private String user, pass;
private boolean sendIntent = true, loginError = false, populateError = false;
public LoginTask(WhiteboardLogin activity, String user, String pass, Context callingContext){
this.activity = activity;
this.user = user.trim();
this.pass = pass.trim();
this.callingContext = callingContext;
}
@Override
protected Void doInBackground(Void... params) {
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("user",user));
nameValuePairs.add(new BasicNameValuePair("pass",pass));
sessionUser = user;
sessionPassword = pass;
//Posts the username and password to the login page and toasts an error if the login doesn't work
if(ServerConnections.PostToLoginPage(callingContext, nameValuePairs, activity.getString(R.string.loginPageURI)) == 1){
dialog.dismiss();
sendIntent = false;
loginError = true;
publishProgress();
return null;
}
else{
userDataList = populateUserDataList(callingContext, user,pass);
if(userDataList == null){
dialog.dismiss();
sendIntent = false;
populateError = true;
return null;
}
}
return null;
}
答案 0 :(得分:22)
doInBackground()方法中的代码在其自己的线程上运行,因此当它们在UI线程上运行时,您无法直接从那里访问任何UI元素。
所以你有两个选择。
您处理在UI线程上运行的onPreExecute()和onPostExecute()方法中的所有UI内容。
您在onProgressUpdate()方法中处理UI内容,该方法也在UI线程上运行。您可以通过调用publishProgress()在doInBackground()中触发此方法。
答案 1 :(得分:2)
你可以在doInBackground里面吐司
使用此代码
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(<your class name>.this, "Cool Ha?", Toast.LENGTH_SHORT).show();
}
});
答案 2 :(得分:1)
您正在尝试更新doInBackground()
中的UI,该UI在与UI线程不同的另一个线程中运行。
您应该在AsyncTask的onPostExecute()
方法中显示Toast:http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result)
答案 3 :(得分:0)
是的,使用日志进行调试是最简单的,但是如果你确实有消息需要在后台处理期间出于任何原因显示,你可以使用 onProgressUpdate()方法,如Flo所述。只要需要编写消息,就可以通过在DoInBackground()中调用publishProgress()来触发此方法。消息内容或处理状态可以通过ASyncTask中的私有变量轻松传递,这些变量可供Background方法和UI方法访问。