Android中子线程操作UI的问题

王正一
  • 1.6k
  1. 最近几天再刷《App研发录》,第6章中一个在子线程操作UI的方法深深困扰了我,求大神解释。

  2. 具体代码如下(在子线程中显示一个AlertDialog):

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

        new Thread(new Runnable() {
            @Override
            public void run() {
                // 添加睡眠代码,防止没有check
                try {
                    Thread.sleep(4000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            
                Looper.prepare();

                new AlertDialog.Builder(MainActivity.this).setTitle("title").setMessage("message")
                        .setPositiveButton("sure", null).show();

                Looper.loop();
            }
        }).start();
    }
  1. 楼主也是一个深入分析过Handler,Looper源码的人,但是不能理解在子线程中构建了一个Looper,new AlertDialog还是在子线程显示了,并没有被抛到主线程中执行,为什么能不报错呢?

回复
阅读 3.7k
1 个回答

这个没问题,因为UI的执行环境是与Looper所在的线程一致的,你的Looper.prepare();是在子线程中调用的,那么这个Looper就是属于该子线程,所以AlertDialog才会在子线程显示。你如果想在主线程显示,你可以在主线程中生成一个Handler,然后在子线程中调用handler.post()方法。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏