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

四川建设厅特种工报名网站一个公司做两个网站可以吗

四川建设厅特种工报名网站,一个公司做两个网站可以吗,html前端网站开发PPT,微网站微商城建设前言 在 Android 开发中,主线程(UI线程)的单线程模型是应用流畅运行的核心保障。理解 Message、Handler、MessageQueue 和 Looper 的协作机制,不仅能优化代码性能,还能避免因线程安全问题导致的崩溃。本文将深入源码与…

前言

在 Android 开发中,主线程(UI线程)的单线程模型是应用流畅运行的核心保障。理解 MessageHandlerMessageQueueLooper 的协作机制,不仅能优化代码性能,还能避免因线程安全问题导致的崩溃。本文将深入源码与实战,解析这些组件的协作关系,并提供完整代码实现和关键点总结。


一、核心组件详解与代码实现

1. Message:消息的载体

职责:封装需要传递的数据或任务。
关键代码

// 创建 Message(推荐复用对象池)
Message msg = Message.obtain();
msg.what = 1;          // 标识消息类型
msg.obj = "Hello";     // 传递数据
msg.arg1 = 100;        // 传递简单数据// 或直接通过 Handler 的 obtainMessage 方法获取
Message msg = handler.obtainMessage(1, "Hello");

源码设计

  • 内部维护静态对象池(链表结构),通过 obtain() 复用对象,避免频繁 GC。
  • target 字段自动指向发送消息的 Handler

2. Handler:消息的发送与处理者

职责:发送消息到队列,并在对应线程处理消息。
关键代码

// 创建 Handler(通常在主线程初始化,自动绑定主线程 Looper)
Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {// 处理消息(在主线程执行)switch (msg.what) {case 1:String data = (String) msg.obj;textView.setText(data);break;}}
};// 发送消息(可在任意线程调用)
new Thread(() -> {handler.sendEmptyMessage(1);// 或 handler.post(() -> { ... });
}).start();

源码设计

  • 构造函数必须绑定一个 Looper(否则抛出异常)。
  • post(Runnable) 本质是将 Runnable 封装为 Messagecallback 字段。

3. MessageQueue:消息队列

职责:按时间优先级存储消息(单链表结构)。
关键源码(简化):

// 消息入队(Handler.enqueueMessage())
boolean enqueueMessage(Message msg, long when) {synchronized (this) {msg.when = when;Message p = mMessages;// 根据执行时间插入到链表合适位置if (p == null || when == 0 || when < p.when) {msg.next = p;mMessages = msg;} else {// 遍历链表找到插入点...}// 唤醒 Looper 如果队列之前为空if (needWake) nativeWake(mPtr);}return true;
}

特性

  • 线程安全:通过 synchronized 锁保证并发操作安全。
  • 延迟消息:通过 when 字段实现定时任务。

4. Looper:消息循环引擎

职责:循环取出消息并分发给 Handler。
关键代码

// 子线程中初始化 Looper
class WorkerThread extends Thread {public Handler handler;@Overridepublic void run() {Looper.prepare();  // 创建 Looper 和 MessageQueuehandler = new Handler(Looper.myLooper()) {@Overridepublic void handleMessage(Message msg) {// 在子线程处理消息}};Looper.loop();     // 启动消息循环(阻塞直到 quit)}
}// 退出 Looper
handler.getLooper().quitSafely();

源码设计

  • loop() 方法通过 for (;;) 死循环不断调用 MessageQueue.next()
  • 主线程的 LooperActivityThread.main() 中初始化,不会退出。

二、使用步骤与最佳实践

场景 1:主线程中使用 Handler

步骤

  1. 直接创建 Handler:默认绑定主线程 Looper。
  2. 发送消息:在子线程通过 handler.sendMessage()post(Runnable)
  3. 处理消息:在 handleMessage() 中更新 UI。
// 示例:子线程下载完成后更新 UI
Handler mainHandler = new Handler(Looper.getMainLooper());
new Thread(() -> {// 模拟耗时任务String result = downloadData();mainHandler.post(() -> textView.setText(result));
}).start();

场景 2:子线程中创建 Looper

步骤

  1. 调用 Looper.prepare():初始化 Looper 和 MessageQueue。
  2. 创建 Handler:绑定子线程的 Looper。
  3. 调用 Looper.loop():启动消息循环。
  4. 退出时调用 quit():避免内存泄漏。
// 子线程消息处理示例
class CustomThread extends Thread {private Handler handler;@Overridepublic void run() {Looper.prepare();handler = new Handler() {@Overridepublic void handleMessage(Message msg) {// 处理子线程任务}};Looper.loop();}public void sendTask(Message msg) {handler.sendMessage(msg);}public void quit() {handler.getLooper().quit();}
}

场景 3:延迟任务与定时消息

// 发送延迟消息(3秒后执行)
handler.sendEmptyMessageDelayed(1, 3000);// 发送定时 Runnable(5秒后更新 UI)
handler.postDelayed(() -> {textView.setText("Delayed Update");
}, 5000);

三、与其他技术的对比

1. Handler vs. AsyncTask

特性HandlerAsyncTask
线程控制需手动切换线程自动管理后台线程与 UI 线程
适用场景简单任务、定时任务短期后台任务(已废弃,建议替代方案)
复杂度灵活,代码稍多封装度高,但生命周期易出问题

2. Handler vs. RxJava

特性HandlerRxJava
用途线程切换、简单异步复杂异步流、事件组合
学习曲线简单陡峭
性能轻量级需要额外库,略重
线程调度需手动管理通过操作符(如 observeOn)自动

四、关键点总结

1. 核心职责

  • Message:数据容器,支持复用。
  • Handler:跨线程通信的桥梁。
  • MessageQueue:按时间排序的消息队列。
  • Looper:消息循环与分发引擎。

2. 协作流程

  1. 初始化Looper.prepare() 创建队列,loop() 启动循环。
  2. 发送消息:Handler 将消息插入队列。
  3. 分发消息:Looper 取出消息,回调 Handler 的 dispatchMessage()
  4. 处理消息:执行 handleMessage()Runnable

3. 最佳实践

  • 复用 Message:使用 obtain() 减少内存分配。
  • 避免内存泄漏:静态内部类 + 弱引用持有 Activity。
  • 及时退出 Looper:子线程任务完成后调用 quit()

五、常见问题与解决方案

1. 主线程卡顿

  • 原因handleMessage() 中执行耗时操作阻塞了 Looper。
  • 解决:确保主线程 Handler 只处理轻量级 UI 更新。

2. 子线程无法更新 UI

  • 原因:Handler 未绑定主线程 Looper。
  • 解决:通过 new Handler(Looper.getMainLooper()) 显式指定。

3. 内存泄漏

  • 原因:非静态内部类 Handler 隐式持有外部类引用。
  • 解决:使用静态内部类 + 弱引用。
static class SafeHandler extends Handler {private WeakReference<Activity> activityRef;SafeHandler(Activity activity) {activityRef = new WeakReference<>(activity);}@Overridepublic void handleMessage(Message msg) {Activity activity = activityRef.get();if (activity != null) {// 更新 UI}}
}

六、总结

Handler 机制是 Android 异步编程的基石,理解其内部原理能帮助开发者写出更高效、健壮的代码。结合源码分析与实践,掌握消息的创建、发送、存储与分发全流程,并灵活运用于 UI 更新、跨线程通信等场景,是进阶 Android 开发的必备技能。


动手实践:尝试在子线程实现一个定时任务管理器,并通过 Handler 与主线程通信更新进度条。


文章转载自:

http://oyByayu2.hksxq.cn
http://IUqOOant.hksxq.cn
http://tj3zaeKE.hksxq.cn
http://X97foY94.hksxq.cn
http://jlj6oa2z.hksxq.cn
http://bK0tiAsX.hksxq.cn
http://NOMfgIkk.hksxq.cn
http://ldUvq4aY.hksxq.cn
http://KWLI6Vbc.hksxq.cn
http://tX2Jz41m.hksxq.cn
http://s6wPhnl9.hksxq.cn
http://V9MKdHJ4.hksxq.cn
http://b1TobEAr.hksxq.cn
http://OggPCY2A.hksxq.cn
http://1Ah9H4O0.hksxq.cn
http://ZaDTO7D5.hksxq.cn
http://Q3NJBlax.hksxq.cn
http://4AvW61E3.hksxq.cn
http://WhVRkrly.hksxq.cn
http://UafuZz4Y.hksxq.cn
http://z4TrZ6zM.hksxq.cn
http://59NoTUlg.hksxq.cn
http://hNdIF9MX.hksxq.cn
http://coeAnDTe.hksxq.cn
http://HOJwQsd5.hksxq.cn
http://iWx0syed.hksxq.cn
http://kLUNEmyu.hksxq.cn
http://rq4Ju1dS.hksxq.cn
http://7Aaxy0T5.hksxq.cn
http://cqkOztSt.hksxq.cn
http://www.dtcms.com/wzjs/745751.html

相关文章:

  • 烟台企业网站怎么优化seo综合查询中的具体内容有哪些
  • 我先做个网站怎么做的c2c平台购物流程
  • 网站后台代码如何做wordpress门户主题 门户一号下载
  • 网站开发设计心得龙岗菠菜网站建设
  • 用flash做的经典网站网站上的图片格式怎么做
  • 黄岛做网站哪家好公司网站规划案例
  • 建设银行临夏分行网站asp.net mvc 网站开发
  • 网站建设基础心得邯郸市出租房屋信息网
  • axrue怎么做网站的原型图网络营销策划步骤
  • 图片在线制作网站yellow的视频播放
  • 建立网站外链常用的渠道有哪些wordpress连接微博源码
  • 国内设计网站公司1771wan网页游戏
  • 网站建设专家如何选汕头网站推广排名
  • 西安网站建设服务商推广普通话奋进新征程宣传语
  • 网站搭建公司排行学做网站论坛插件
  • 蓝牙音箱东莞网站建设直播平台开发多少钱
  • 汽车行业网站建设方案达州市住房和建设厅网站
  • 虚拟主机网站怎么上传文件遨游建站
  • 潍坊市房屋和城乡建设局网站网站开发的收入
  • 建设网站如何加入搜索网站开发vs2015是什么
  • 网站建设全屏广州网站建设全包
  • 网站服务器有哪些种类给个网站可以在线
  • 网站建设与维护 出题狮山公司网站建设
  • 门户网站改造方案阿里巴巴每平每屋设计家官网
  • 如何做网站赚钱6毕业生就业推荐表模板网站开发
  • 商水县建设局网站网站构造下拉列表怎么做
  • 统计网站建设程序网站开发基本要求
  • 无域名网站 能否被百度天津微信网站
  • 苏宁易购的网站建设企业网站建设任务书
  • wordpress建站图片效果网站建设哪家合适