我在我的应用程序中使用异步任务。我正在启动预执行的进度对话框,在doInBackground中我正在调用一个函数,该函数将从地理编码器返回当前位置。如果当前位置不可用我是显示一个对话框以手动输入该位置。但是当对话框出现时它会崩溃。我甚至无法在该功能中使用吐司,导致强制关闭。可以解决此问题的解决方案..? 请帮忙.. 这是我得到的错误..
01-03 09:45:36.216: E/AndroidRuntime(452): FATAL EXCEPTION: AsyncTask #1
01-03 09:45:36.216: E/AndroidRuntime(452): java.lang.RuntimeException: An error occured while executing doInBackground()
01-03 09:45:36.216: E/AndroidRuntime(452): at android.os.AsyncTask$3.done(AsyncTask.java:200)
01-03 09:45:36.216: E/AndroidRuntime(452): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
01-03 09:45:36.216: E/AndroidRuntime(452): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
01-03 09:45:36.216: E/AndroidRuntime(452): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
01-03 09:45:36.216: E/AndroidRuntime(452): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
01-03 09:45:36.216: E/AndroidRuntime(452): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
01-03 09:45:36.216: E/AndroidRuntime(452): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
01-03 09:45:36.216: E/AndroidRuntime(452): at java.lang.Thread.run(Thread.java:1019)
01-03 09:45:36.216: E/AndroidRuntime(452): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
01-03 09:45:36.216: E/AndroidRuntime(452): at android.os.Handler.<init>(Handler.java:121)
01-03 09:45:36.216: E/AndroidRuntime(452): at android.widget.Toast.<init>(Toast.java:68)
01-03 09:45:36.216: E/AndroidRuntime(452): at android.widget.Toast.makeText(Toast.java:231)
我的异步任务就是这个。
private class UpdateCity extends AsyncTask<String, Void, Void> {
ProgressDialog dialog = new ProgressDialog(this);
@Override
protected void onPreExecute() {
this.dialog.setMessage("Please wait for few seconds...");
this.dialog.setTitle("");
this.dialog.show();
}
@Override
protected Void doInBackground(final String... args) {
checkCity(Cplacename);//my function
return null;
}
@Override
protected void onPostExecute(final Void unused) {
this.dialog.dismiss();
}
}
答案 0 :(得分:3)
无法在未调用的线程内创建处理程序 Looper.prepare()
从Logcat中的上述错误看来,您似乎正在尝试从非UI线程更新UI。您应该使用runOnUiThread()
从非UI线程更新UI。
Activity_name.this.runOnUiThread(new Runnable() {
public void run() {
checkCity(Cplacename);
}
});
答案 1 :(得分:1)
logcat
的后半部分指的是某些Toast
。您是否在Toast
函数中显示了一些doInBackground()
?如果有的话,删除它,它应该工作。请记住,Toast
是一个UI元素。