【问题标题】:Handle with AlertDialog into the AsyncTask用 AlertDialog 处理到 AsyncTask
【发布时间】:2014-11-05 10:48:42
【问题描述】:

我正在尝试将AlertDialog 呼叫到AsyncTask。我编写了这段代码并且它可以工作,但是当我在AlertDialog 中选择项目时AlertDialog 冻结但前台用户界面正在工作。请帮助我为我的任务编写正确的代码,或者请帮助我在选择项目后修复冻结AlertDialog。我试图在uiHandler.getLooper.suit() 行之前调用dismiss() 方法,但没有任何改变。

@Override
protected Void doInBackground(Void... arg0) {
    Looper.prepare();
    final Handler uiHandler = new Handler();
    uiHandler.post(new Runnable() {
        public void run() {
            AlertDialog.Builder chooser = new AlertDialog.Builder(ctx);
            facultyChooser.setTitle("Choose")
                    .setCancelable(false)
                    .setItems(faculties, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int item) {
                            uiHandler.getLooper().quit();
                        }
                    })
                    .create()
                    .show();
        }
    });
    Looper.loop();
}

PS:为了便于阅读,它不是完整的代码。

【问题讨论】:

  • uiHandler.getLooper().quit();在 onClick 中调用。通过删除它来检查..
  • @Aun,如果我删除它 Looper 将不会停止。关闭对话框后什么也没有发生。

标签: android android-asynctask handler android-alertdialog


【解决方案1】:

我认为发生错误是因为您尝试在doInBackground(后台线程)中运行Handler(UI 线程)。我的解决方案将确保在 UI 线程中创建警报对话框。

移动此代码:

       AlertDialog.Builder chooser = new AlertDialog.Builder(ctx);
        facultyChooser.setTitle("Choose")
                .setCancelable(false)
                .setItems(faculties, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int item) {
                        uiHandler.getLooper().quit();
                    }
                })
                .create()
                .show();

发送至onPostExecuteonPreExecute,以确保在 UI 线程上创建对话框。

并删除 final Handler uiHandler = new Handler();,因为 onPostExecute/onPreExecute 已经在 UI 线程上运行。

【讨论】:

  • 我无法将其移至 onPostExecute,因为 onPostExecute 正在保存我的解析结果。
【解决方案2】:

据我了解,在这种情况下,您不需要 Looper 和 all。可以试试吗?

protected Void doInBackground(Void... arg0) {
     Handler uiHandler = new Handler(Looper.getMainLooper());
    uiHandler.post(new Runnable() {
        public void run() {
            AlertDialog.Builder chooser = new AlertDialog.Builder(ctx);
            facultyChooser.setTitle("Choose")
                    .setCancelable(false)
                    .setItems(faculties, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int item) {
                            dialog.dismiss();
                        }
                    })
                    .create()
                    .show();
        }
    });
}

【讨论】:

  • 它工作正常。谢谢你的回答。我在哪里可以阅读有关 Handler 和 Android 线程的信息,以便像 U ))) 一样理解它?
  • 大声笑...早快乐 ((( Afrer }); 解析开始和处理程序不要等待 AlertDialog 选择并立即开始解析。我怎样才能像join() 一样直到未选择对话框项?
猜你喜欢
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多