加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

Android动静机制Handler,有须要再讲一次

发布时间:2019-08-01 23:57:12 所属栏目:业界 来源:Engineers
导读:我们在一般开拓中,老是不行停止的会用到 Handler,虽说 Handler 机制并不等同于 Android 的动静机制,但 Handler 的动静机制在 Android 开拓中早已谙熟于心,很是重要! 通过本文,你可以很是轻易获得一下题目的谜底: Handler、Looper、Message 和 Messag
副问题[/!--empirenews.page--]

我们在一般开拓中,老是不行停止的会用到 Handler,虽说 Handler 机制并不等同于 Android 的动静机制,但 Handler 的动静机制在 Android 开拓中早已谙熟于心,很是重要!

Android动静机制Handler,有须要再讲一次

通过本文,你可以很是轻易获得一下题目的谜底:

  1. Handler、Looper、Message 和 MessageQueue 的道理以及它们之间的相关到底是奈何的?
  2. MessageQueue 存储布局是什么?
  3. 子线程为啥必然要挪用 Looper.prepare() 和 Looper.loop()?

Handler 的简朴行使

信托应该没有人不会行使 Handler 吧?假设在 Activity 中处理赏罚一个耗时使命,必要更新 UI,简朴看看我们平常是怎么处理赏罚的。

  1. override fun onCreate(savedInstanceState: Bundle?) { 
  2.  super.onCreate(savedInstanceState) 
  3.  setContentView(R.layout.activity_main3) 
  4.  // 哀求收集 
  5.  subThread.start() 
  6. override fun onDestroy() { 
  7.  subThread.interrupt() 
  8.  super.onDestroy() 
  9. private val handler by lazy(LazyThreadSafetyMode.NONE) { MyHandler() } 
  10. private val subThread by lazy(LazyThreadSafetyMode.NONE) { SubThread(handler) } 
  11. private class MyHandler : Handler() { 
  12.  override fun handleMessage(msg: Message) { 
  13.  super.handleMessage(msg) 
  14.  // 主线程处理赏罚逻辑,一样平常这里必要行使弱引用持有 Activity 实例,以免内存走漏 
  15.  } 
  16. private class SubThread(val handler: Handler) : Thread() { 
  17.  override fun run() { 
  18.  super.run() 
  19.  // 耗时操纵 好比做收集哀求 
  20.  // 收集哀求完毕,咱们就得哗哗哗关照 UI 革新了,直接直接思量 Handler 处理赏罚,其他方案暂且不做思量 
  21.  // 第一种要领,一样平常这个 data 是哀求功效理会的内容 
  22.  handler.obtainMessage(1,data).sendToTarget() 
  23.  // 第二种要领 
  24.  val message = Message.obtain() // 只管行使 Message.obtain() 初始化 
  25.  message.what = 1 
  26.  message.obj = data // 一样平常这个 data 是哀求功效理会的内容 
  27.  handler.sendMessage(message) 
  28.  // 第三种要领 
  29.  handler.post(object : Thread() { 
  30.  override fun run() { 
  31.  super.run() 
  32.  // 处理赏罚更新操纵 
  33.  } 
  34.  }) 
  35.  } 

上述代码很是简朴,由于收集哀求是一个耗时使命,以是我们新开了一个线程,并在收集哀求竣事理会完毕后通过 Handler 来关照主线程去更新 UI,简朴回收了 3 种方法,仔细的小搭档也许会发明,着实第一种和第二种要领是一样的。就是操作 Handler 来发送了一个携带了内容 Message 工具,值得一提的是:我们应该尽也许地行使 Message.obtain() 而不是 new Message() 举办 Message 的初始化,首要是 Message.obtain() 可以镌汰内存的申请。

受到各人在前面文章提出的提议,我们就只管地少贴一些源码了,各人可以直接很轻易发明,上述的全部要领最终城市挪用这个要领:

  1. public boolean sendMessageAtTime(Message msg, long uptimeMillis) { 
  2.  MessageQueue queue = mQueue; 
  3.  if (queue == null) { 
  4.  RuntimeException e = new RuntimeException( 
  5.  this + " sendMessageAtTime() called with no mQueue"); 
  6.  Log.w("Looper", e.getMessage(), e); 
  7.  return false; 
  8.  } 
  9.  return enqueueMessage(queue, msg, uptimeMillis); 
  10. private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { 
  11.  msg.target = this; 
  12.  if (mAsynchronous) { 
  13.  msg.setAsynchronous(true); 
  14.  } 
  15.  return queue.enqueueMessage(msg, uptimeMillis); 

上面的代码呈现了一个 MessageQueue,而且最终挪用了 MessageQueue#enqueueMessage 要领进动作静的入队,我们不得不简朴说一下 MessageQueue 的根基环境。

MessageQueue

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读