当前位置: 首页 > wzjs >正文

如何制作自己的网站链接视频简述网站建设的一般流程

如何制作自己的网站链接视频,简述网站建设的一般流程,如何看访问网站的dns,惠州品牌网站建设Handler消息机制源码分析 一、概述 Handler消息机制是Android系统中最重要的特性之一,它主要用于解决Android单线程模型中的线程间通信问题。本文将深入分析Handler消息机制的源码实现,帮助你理解其工作原理。 二、基础知识 2.1 Handler消息机制的核…

Handler消息机制源码分析

一、概述

Handler消息机制是Android系统中最重要的特性之一,它主要用于解决Android单线程模型中的线程间通信问题。本文将深入分析Handler消息机制的源码实现,帮助你理解其工作原理。

二、基础知识

2.1 Handler消息机制的核心类

  • Handler:消息处理者,负责发送和处理消息
  • Message:消息对象,包含要传递的信息
  • MessageQueue:消息队列,用于存储消息
  • Looper:消息循环器,不断从MessageQueue中取出消息并交给Handler处理

2.2 基本工作流程

  1. Handler发送消息到MessageQueue
  2. Looper不断从MessageQueue中取出消息
  3. Handler处理Looper分发来的消息

三、源码分析

3.1 Handler的创建

class MainActivity : AppCompatActivity() {private val handler = object : Handler(Looper.getMainLooper()) {override fun handleMessage(msg: Message) {when (msg.what) {MSG_UPDATE_UI -> updateUI()}}}
}

源码中Handler的构造过程:

public Handler(@Nullable Looper looper) {this(looper, null, false);
}public Handler(@Nullable Looper looper, @Nullable Callback callback, boolean async) {mLooper = looper;mQueue = looper.mQueue;mCallback = callback;mAsynchronous = async;
}

3.2 消息的发送过程

// 发送消息的几种方式
handler.sendMessage(msg)
handler.sendEmptyMessage(what)
handler.sendMessageDelayed(msg, delayMillis)
handler.post(runnable)

源码分析:

public final boolean sendMessage(@NonNull Message msg) {return sendMessageDelayed(msg, 0);
}public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {if (delayMillis < 0) {delayMillis = 0;}return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {MessageQueue queue = mQueue;return enqueueMessage(queue, msg, uptimeMillis);
}private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,long uptimeMillis) {msg.target = this;msg.workSourceUid = ThreadLocalWorkSource.getUid();if (mAsynchronous) {msg.setAsynchronous(true);}return queue.enqueueMessage(msg, uptimeMillis);
}

3.3 MessageQueue的工作原理

MessageQueue是一个优先级队列,按照消息的执行时间排序。

boolean enqueueMessage(Message msg, long when) {// 省略参数检查代码synchronized (this) {msg.markInUse();msg.when = when;Message p = mMessages;boolean needWake;// 根据时间顺序将消息插入队列if (p == null || when == 0 || when < p.when) {msg.next = p;mMessages = msg;needWake = mBlocked;} else {needWake = mBlocked && p.target == null && msg.isAsynchronous();Message prev;for (;;) {prev = p;p = p.next;if (p == null || when < p.when) {break;}}msg.next = p;prev.next = msg;}if (needWake) {nativeWake(mPtr);}}return true;
}

3.4 Looper的消息循环

Looper负责从MessageQueue中取出消息并分发给Handler处理。

public static void loop() {final Looper me = myLooper();final MessageQueue queue = me.mQueue;for (;;) {Message msg = queue.next(); // 可能阻塞if (msg == null) {return;}try {msg.target.dispatchMessage(msg);} finally {msg.recycleUnchecked();}}
}

四、实战案例

4.1 异步任务处理

class ImageLoadActivity : AppCompatActivity() {private val handler = object : Handler(Looper.getMainLooper()) {override fun handleMessage(msg: Message) {when (msg.what) {MSG_LOAD_SUCCESS -> {val bitmap = msg.obj as BitmapimageView.setImageBitmap(bitmap)}MSG_LOAD_FAILED -> {Toast.makeText(this@ImageLoadActivity, "加载失败", Toast.LENGTH_SHORT).show()}}}}private fun loadImage() {Thread {try {val bitmap = loadImageFromNetwork()val msg = Message.obtain()msg.what = MSG_LOAD_SUCCESSmsg.obj = bitmaphandler.sendMessage(msg)} catch (e: Exception) {handler.sendEmptyMessage(MSG_LOAD_FAILED)}}.start()}companion object {const val MSG_LOAD_SUCCESS = 1const val MSG_LOAD_FAILED = 2}
}

4.2 延时任务处理

class CountDownActivity : AppCompatActivity() {private var countDown = 60private val handler = object : Handler(Looper.getMainLooper()) {override fun handleMessage(msg: Message) {when (msg.what) {MSG_COUNT_DOWN -> {countDown--tvCountDown.text = "${countDown}s"if (countDown > 0) {sendEmptyMessageDelayed(MSG_COUNT_DOWN, 1000)}}}}}override fun onDestroy() {super.onDestroy()handler.removeCallbacksAndMessages(null)}companion object {const val MSG_COUNT_DOWN = 1}
}

五、调试技巧

5.1 使用Looper.getMainLooper().setMessageLogging()跟踪消息

Looper.getMainLooper().setMessageLogging { log ->Log.d("MessageLogging", log)
}

5.2 使用systrace工具分析消息处理耗时

TraceCompat.beginSection("handleMessage")
try {// 处理消息
} finally {TraceCompat.endSection()
}

六、性能优化

6.1 避免内存泄漏

  • 使用静态内部类+弱引用
  • Activity销毁时移除消息
  • 使用LifecycleOwner管理Handler生命周期
class SafeHandler(lifecycleOwner: LifecycleOwner, private val callback: Handler.Callback) : Handler(Looper.getMainLooper()) {private val lifecycleRef = WeakReference(lifecycleOwner)init {lifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {override fun onDestroy(owner: LifecycleOwner) {removeCallbacksAndMessages(null)}})}override fun handleMessage(msg: Message) {lifecycleRef.get()?.let { lifecycle ->if (lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) {callback.handleMessage(msg)}}}
}

6.2 消息复用

使用Message.obtain()而不是new Message()

val msg = Message.obtain()
try {msg.what = MSG_TYPEmsg.obj = datahandler.sendMessage(msg)
} catch (e: Exception) {msg.recycle()
}

七、常见面试题

7.1 Handler实现原理?

答:Handler的实现主要基于消息队列模型,包含四个核心组件:

  1. Handler:消息处理者,负责发送和处理消息
  2. Message:消息对象,存储消息的内容和元数据
  3. MessageQueue:消息队列,按时间顺序存储消息
  4. Looper:消息循环器,不断从队列中取出消息并分发给Handler

工作流程:

  1. Handler发送消息,消息进入MessageQueue
  2. Looper不断循环从MessageQueue中取出消息
  3. 消息分发给对应的Handler处理

7.2 Handler引起的内存泄漏原因及解决方案?

答:
原因:

  • Handler作为内部类持有外部Activity的引用
  • 发送延迟消息后Activity销毁,而消息队列中的Message持有Handler引用,Handler又持有Activity引用

解决方案:

  1. 使用静态内部类+弱引用
  2. Activity销毁时清空消息队列
  3. 使用LifecycleOwner管理Handler生命周期

7.3 Handler线程切换原理?

答:

  1. 每个线程可以通过Looper.prepare()创建Looper对象
  2. Looper对象包含一个MessageQueue
  3. Handler在构造时关联了Looper对象
  4. 消息会被发送到Looper关联的MessageQueue
  5. Looper所在线程通过loop()方法不断取出消息并处理

因此,Handler发送的消息在哪个线程被处理,取决于Handler构造时传入的Looper对象所属的线程。

八、源码分析小结

通过分析Handler消息机制的源码,我们了解到:

  1. Handler消息机制是一个生产者-消费者模型
  2. MessageQueue通过单链表实现优先级队列
  3. Looper通过死循环不断处理消息,但不会导致ANR
  4. 消息处理过程是同步的,保证了线程安全
  5. 系统通过ThreadLocal维护Looper,保证线程隔离

掌握Handler消息机制的原理,对于理解Android系统的消息驱动模型和异步编程具有重要意义。在实际开发中,合理使用Handler可以优雅地解决线程间通信问题。

九、参考资源

  1. Android源码:Handler.java
  2. Android开发者文档:Handler API Guide
  3. Android源码分析:Looper.java

本文通过深入分析Handler消息机制的源码实现,结合实际案例和面试题,帮助你全面理解Android消息机制的工作原理。在实际开发中,建议结合本文提供的最佳实践,合理使用Handler,避免常见问题。如果你对Handler机制还有任何疑问,欢迎在评论区留言交流。

http://www.dtcms.com/wzjs/47432.html

相关文章:

  • 榆次网站建设百度网页版下载安装
  • 网站建设公司好吗网页开发培训网
  • 劫持别人的网站做违法的事会怎么样百度高级搜索引擎
  • 开发工具在哪里 word北京债务优化公司
  • 重庆网站建设yunhuit班级优化大师电脑版
  • 网站开发分为哪几块杭州百家号优化
  • 珙县网站建设什么是百度搜索推广
  • 镇江网站建设推广公司seo网页优化服务
  • 昆明做网站建设方案百度售后服务电话
  • 可以做软件的网站有哪些功能吗如何搭建一个网站平台
  • 企业网站怎么建设万网域名交易
  • wordpress代码上传到服务器seo爱站网
  • 荥阳seo推广广州seo公司推荐
  • 专业做网站建设设计百度竞价排名价格
  • 宣传片制作报价单苏州seo关键词优化排名
  • 网站开发行业分析微信营销是什么
  • 苏宁易购商城免费网站推广优化
  • 网站建设后台管理怎么进入如何规划企业网络推广方案
  • 建设全网营销型网站流量大的推广平台有哪些
  • 建立数据透视表怎么做真实的优化排名
  • 男女做暖暖视频网站太原百度seo排名
  • 帝国cms灵动标签做网站地图希爱力的功效及副作用
  • 供应链网站制作谷歌优化教程
  • 华夏名网网站管理助手产品软文
  • 有没有做衣服的网站搜索引擎优化的含义
  • 刘强东当年做网站读的什么书网络安全培训
  • 婚纱网站内容制作谷歌浏览器下载安装
  • 阿里巴巴网站建设基本内容百度账号中心
  • 做内网网站教程网站服务器搭建与管理
  • 网站开发技术框架福建省人民政府门户网站