副问题[/!--empirenews.page--]
我们在一般开拓中,老是不行停止的会用到 Handler,虽说 Handler 机制并不等同于 Android 的动静机制,但 Handler 的动静机制在 Android 开拓中早已谙熟于心,很是重要!
![Android动静机制Handler,有须要再讲一次 Android动静机制Handler,有须要再讲一次](http://img25.aspzz.cn/uploads/allimg/c190725/15640434QM5P-1X34.jpg)
通过本文,你可以很是轻易获得一下题目的谜底:
- Handler、Looper、Message 和 MessageQueue 的道理以及它们之间的相关到底是奈何的?
- MessageQueue 存储布局是什么?
- 子线程为啥必然要挪用 Looper.prepare() 和 Looper.loop()?
Handler 的简朴行使
信托应该没有人不会行使 Handler 吧?假设在 Activity 中处理赏罚一个耗时使命,必要更新 UI,简朴看看我们平常是怎么处理赏罚的。
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main3)
- // 哀求收集
- subThread.start()
- }
- override fun onDestroy() {
- subThread.interrupt()
- super.onDestroy()
- }
- private val handler by lazy(LazyThreadSafetyMode.NONE) { MyHandler() }
- private val subThread by lazy(LazyThreadSafetyMode.NONE) { SubThread(handler) }
- private class MyHandler : Handler() {
- override fun handleMessage(msg: Message) {
- super.handleMessage(msg)
- // 主线程处理赏罚逻辑,一样平常这里必要行使弱引用持有 Activity 实例,以免内存走漏
- }
- }
- private class SubThread(val handler: Handler) : Thread() {
- override fun run() {
- super.run()
- // 耗时操纵 好比做收集哀求
- // 收集哀求完毕,咱们就得哗哗哗关照 UI 革新了,直接直接思量 Handler 处理赏罚,其他方案暂且不做思量
- // 第一种要领,一样平常这个 data 是哀求功效理会的内容
- handler.obtainMessage(1,data).sendToTarget()
- // 第二种要领
- val message = Message.obtain() // 只管行使 Message.obtain() 初始化
- message.what = 1
- message.obj = data // 一样平常这个 data 是哀求功效理会的内容
- handler.sendMessage(message)
- // 第三种要领
- handler.post(object : Thread() {
- override fun run() {
- super.run()
- // 处理赏罚更新操纵
- }
- })
- }
- }
上述代码很是简朴,由于收集哀求是一个耗时使命,以是我们新开了一个线程,并在收集哀求竣事理会完毕后通过 Handler 来关照主线程去更新 UI,简朴回收了 3 种方法,仔细的小搭档也许会发明,着实第一种和第二种要领是一样的。就是操作 Handler 来发送了一个携带了内容 Message 工具,值得一提的是:我们应该尽也许地行使 Message.obtain() 而不是 new Message() 举办 Message 的初始化,首要是 Message.obtain() 可以镌汰内存的申请。
受到各人在前面文章提出的提议,我们就只管地少贴一些源码了,各人可以直接很轻易发明,上述的全部要领最终城市挪用这个要领:
- public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
- MessageQueue queue = mQueue;
- if (queue == null) {
- RuntimeException e = new RuntimeException(
- this + " sendMessageAtTime() called with no mQueue");
- Log.w("Looper", e.getMessage(), e);
- return false;
- }
- return enqueueMessage(queue, msg, uptimeMillis);
- }
- private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
- msg.target = this;
- if (mAsynchronous) {
- msg.setAsynchronous(true);
- }
- return queue.enqueueMessage(msg, uptimeMillis);
- }
上面的代码呈现了一个 MessageQueue,而且最终挪用了 MessageQueue#enqueueMessage 要领进动作静的入队,我们不得不简朴说一下 MessageQueue 的根基环境。
MessageQueue
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|