在选择对话框选项之前可以停止线程吗?

It is possible to stop a thread until a dialog option has been chosed?

据我们所知,android 对话框只能在主 UI 线程下创建和显示。

问题是我有一个进度条,很多工作是在一个线程中完成的,在进度的某些部分我必须显示一个对话框,用户必须 select 一个选项来获取工作继续。

所以..我需要在线程中显示一个对话框(阻塞线程直到用户select编辑了一个选项)。

我用这段代码试过了

public void showDialog(Activity activity) {
    Looper.prepare();
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);

    // set title
    alertDialogBuilder.setTitle("");

    // set dialog message
    alertDialogBuilder
        .setMessage(R.string.STREAM_NOT_WIFI)
        .setCancelable(false)
        .setPositiveButton(R.string.STREAM_NOT_WIFI_YES, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                preload=true;
            }
        })
        .setNegativeButton(R.string.CANCEL, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
                preload=false;
            }
        });

    // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();

    // show it
    alertDialog.show();
}

但我收到这条消息,但没有显示对话框:

"attempting to initialize hardware acceleration outside of the main thread, aborting"

您不能简单地调用 Looper.prepare() 并在 UI 线程上显示任何线程。您需要后台线程与 UI 线程进行交互,该线程有限制。

这是一个与此相关的很好的 SO 问题,但请务必阅读 3 或 4 个答案(不仅仅是第一个)并且问题本身是关于 Toast - 忽略它。你遇到的问题类似...

Can't create handler inside thread that has not called Looper.prepare()

此外,您可以在此处查看有关此类问题的教程:

http://codetheory.in/android-handlers-runnables-loopers-messagequeue-handlerthread/

ActivityView 中有内置方法,您可以使用这些方法将 post 任务从非 UI 线程转换为 UI 线程-线。其中之一是 ActivityrunOnUiThread

样本:

public class MainActivity extends Activity {

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Thread thread = new Thread(new Runnable() {

            private final Object lock = new Object();
            private volatile boolean isEnabled = true;

            @Override public void run() {

                while (isEnabled) {
                    try {
                        Log.e("sample", "working...");
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        //
                    }


                    runOnUiThread(new Runnable() {
                        @Override public void run() {
                            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                            builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
                                @Override public void onClick(DialogInterface dialog, int which) {
                                    synchronized (lock) {
                                        lock.notify();
                                    }
                                }
                            });
                            builder.show();
                        }
                    });

                    synchronized (lock) {
                        try {
                            Log.e("sample", "work stopped. Waiting for dialog click.");
                            lock.wait();
                        } catch (InterruptedException e) {
                            //
                        }
                    }

                }

            }
        });
        thread.start();
    }
}

示例看起来很乱,但它显示了来自非 UI 线程的 运行 任务的基础知识。 Activity 启动 Thread,其中 "works" 持续 5 秒,然后要求用户继续。当用户点击对话框的按钮时,线程会继续执行工作。