博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异步消息处理机制 简析
阅读量:5227 次
发布时间:2019-06-14

本文共 2521 字,大约阅读时间需要 8 分钟。

1。什么是异步消息处理?

答:对于普通的线程来说,执行完run()方法内的代码后线程就结束了。而异步消息处理线程是指:线程启动后会进入一个无限循环体之中,每执行一次,从线程内部的消息队列中取出一个消息,并回调相应的消息处理函数,执行完一个消息后则继续循环。如果消息队列为空,线程会暂停(一般也就是我们调用休眠方法),直到消息队列中又新的消息。

2.什么时候使用异步消息处理?

答:当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉。Handler就是把这些功能放到一个单独的线程里执行,与Activity互不影响。因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。

3.android中异步消息处理由四部分组成,Message,Handler,MessageQueue,Looper。

a.Message:

    Message是在线程中传递的消息,它可以在内部携带少量的信息,用于在不同的线程间交换数据。

b.Handle:

    Handle主要用于发送和处理消息。发送消息一般使用的是SendMessage()方法,而发送的消息经过一系列的处理后,最终会传到Handle的Message()方法中。

c.MessageQueue

    MessageQueue是消息队列的意思,主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程只会有一个MessageQueue对象。

d。Looper

   调用Looper中的loop()方法后,就会进入一个无限循环中,每当发现MessageQueue中存在的一条消息,就会将他取出,并传递到Hander的handleMessage()方法中。每个线程也都会有一个Looper对象

4.简单的例子:

public class MainActivity extends ActionBarActivity {        public static final int UPDATE_TEXT=1;        private Button button;        private TextView text;        private Handler handler=new Handler(){        public void handleMessage(Message msg){            switch (msg.what) {            case UPDATE_TEXT:                                text.setText("Nice to meet you");                                break;            default:                break;            }        }            };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                button = (Button)findViewById(R.id.change_text);        text = (TextView)findViewById(R.id.text);                ButtonListener listener=new ButtonListener();        button.setOnClickListener(listener);    }                class ButtonListener implements OnClickListener{        @Override        public void onClick(View v) {                        switch (v.getId()) {            case R.id.change_text:                                new Thread(new Runnable() {                                        @Override                    public void run() {                                                Message message=new Message();                        message.what=UPDATE_TEXT;                        handler.sendMessage(message);                                            }                }).start();                                break;            default:                break;            }                    }            }}

 

转载于:https://www.cnblogs.com/mercuryli/p/4509875.html

你可能感兴趣的文章
linux php编译安装
查看>>
name phone email正则表达式
查看>>
721. Accounts Merge
查看>>
OpenCv-Python 图像处理基本操作
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>
redis哨兵集群、docker入门
查看>>
正则表达式2
查看>>
Unity3D_(插件)小地图自刷新制作Minimap小地图
查看>>
为什么分布式一定要有Redis?
查看>>
hihoCoder 1233 : Boxes(盒子)
查看>>
团队的绩效评估计划
查看>>
oracle中anyData数据类型的使用实例
查看>>
C++对vector里面的元素排序及取任意重叠区间
查看>>
软件测试——性能测试总结
查看>>
12.4站立会议
查看>>
SSM整合(精简版)
查看>>
各种xml文件约束,Eclipse用
查看>>
泰勒展开,傅里叶变换,拉普拉斯变换和Z变换的物理意义
查看>>
Java Concurrentmodificationexception异常原因和解决方法
查看>>