Android中子线程操作UI的问题

发布于 2022-09-02 15:39:22 字数 1016 浏览 17 评论 0

  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还是在子线程显示了,并没有被抛到主线程中执行,为什么能不报错呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蓝天 2022-09-09 15:39:22

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文