以下是我班级的代码片段,我是如何调用alertDialog的。在我的情况下,如果count为零,则asynctask必须终止并显示对话框:
if(count == 0){
NumberPlateActivity np = new NumberPlateActivity();
np.dialog(con);
}
这是我的主要活动中的方法,它假设中断asynctask并打开对话框:
public void dialog(final Context context){
new Thread() { public void run() {
NumberPlateActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
try{
ImageProc stop = new ImageProc();// ImageProc - asynctask
stop.cancel(true);
} catch (Exception e) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
AlertDialog alert = builder.create();
alert.show();
builder.setMessage("Plate not found. Try again!")
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent();
intent.setClass(context.getApplicationContext(), ANPR.class);
context.startActivity(intent);
}
});
}
}});
}
}.start();
}
运行代码后,我收到此错误:无法在未调用Looper.prepare()
的线程内创建处理程序。
有什么建议吗?
答案 0 :(得分:0)
您正在运行活动的主线程内创建一个处理程序。你应该在一个单独的线程中完成它。
我没有在你的代码中看到任何处理程序,所以你可能在我们没有看到的地方使用它。
答案 1 :(得分:0)
如果您要终止AsyncTask,为什么不这样做:
void onPostExecute(...)
{
if (count == 0)
{
NumberPlateActivity np = new NumberPlateActivity();
np.dialog(con);
}
}
对我来说似乎是最简单的解决方案!这也意味着你可以摆脱Thread
中的Runnable
和public void dialog(final Context context)
。
至于您的public void dialog(final Context context)
方法,我看不出有Thread
课程的任何理由,并且:
ImageProc stop = new ImageProc();// ImageProc - asynctask
stop.cancel(true);
我看不出任何明显的理由来创建AsyncTask
,然后立即将其删除。