美文网首页
Android Handler之从主线程往子线程发消息

Android Handler之从主线程往子线程发消息

作者: 一川烟草i蓑衣 | 来源:发表于2019-11-30 14:51 被阅读0次

    网上有关Handler机制的文章已经不能用汗牛充栋来形容了,然而每次看的时候总觉得少了点什么,只好自己写一下自己对Handler的理解,欢迎各路大神拍砖。

    一、Handler机制是什么?

    答:Handler机制是Android中用于线程间通信一套通信机制。

    二、为什么是Handler?Handler机制为什么被那么多次的提及?

    答:从Android4.0开始,Android中请求网络强制不允许在主线程中操作,而更新UI的操作由不允许在子线程中更新UI。当我们的码农在子线程中请求网络,拿到服务器返回的数据之后,要更新UI。由于系统的要求,势必会产生一种矛盾:数据在子线程,更新UI要在主线程。此时我们必须要把数据返回到主线程中才行,Handler机制应运而生。

    在问题一中我们知道了Handler是一套线程间通信机制,由于Android系统的要求,所以经常被用于更新UI。

    总结一下:Handler机制是Android中一套用于线程间通信的机制,只不过经常被我们用于更新UI

    三、怎么从子线程发消息到主线程?

    示例代码如下:

    //在主线程中初始化Handler

      private Handler handler = new Handler() {

            @Override

            public void handleMessage(Message msg) {

                super.handleMessage(msg);

            //在此处处理消息

            }

        };

    Thread thread = new Thread(){

                @Override

                public void run() {

                    super.run();

                    //在子线程中发送消息

                    handler.sendEmptyMessage(0);

                }

            };

      thread.start();

    额,这个大家都会,写在这里是为了承上启下,抛自己的砖,引自己的玉

    四、怎么从主线程发送消息到子线程?(虽然这种应用场景很少)

    示例代码

      Thread thread = new Thread(){

                @Override

                public void run() {

                    super.run();

                    //初始化Looper

                    Looper.prepare();

                    //在子线程内部初始化handler即可,发送消息的代码可在主线程任意地方发送

                    handler=new Handler(){

                        @Override

                        public void handleMessage(Message msg) {

                            super.handleMessage(msg);

                          //所有的事情处理完成后要退出looper,即终止Looper循环

                            //这两个方法都可以,有关这两个方法的区别自行寻找答案

                            handler.getLooper().quit();

                            handler.getLooper().quitSafely();

                        }

                    };

                    //启动Looper循环

                    Looper.loop();

                }

            };

            thread.start();

    上述代码中,在初始化handler前后均有两句关键代码,一定不能遗忘,否则你会收到以下异常

    相关文章

      网友评论

          本文标题:Android Handler之从主线程往子线程发消息

          本文链接:https://www.haomeiwen.com/subject/vvyowctx.html