如何在类的主活动中中断asynctask以显示alertDialog?

时间:2011-11-27 18:20:25

标签: android android-asynctask

以下是我班级的代码片段,我是如何调用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()的线程内创建处理程序。 有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您正在运行活动的主线程内创建一个处理程序。你应该在一个单独的线程中完成它。

我没有在你的代码中看到任何处理程序,所以你可能在我们没有看到的地方使用它。

答案 1 :(得分:0)

如果您要终止AsyncTask,为什么不这样做:

void onPostExecute(...)
{
    if (count == 0)
    {
        NumberPlateActivity np = new NumberPlateActivity();
        np.dialog(con);
    }
}

对我来说似乎是最简单的解决方案!这也意味着你可以摆脱Thread中的Runnablepublic void dialog(final Context context)

至于您的public void dialog(final Context context)方法,我看不出有Thread课程的任何理由,并且:

ImageProc stop = new ImageProc();// ImageProc - asynctask
stop.cancel(true);

我看不出任何明显的理由来创建AsyncTask,然后立即将其删除。