Android基础-线程Thread基础

90 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

Android异步处理

Android在处理异步消息时涉及到HandleLooperMessage以及MessageQueue

image.png

  • Handler主要是消息发送和接收者,负责将Message发送到Looper和接收Looper的消息。
  • Looper是作为"传送带"的角色,连接了HandlerMessageQueue,而消息循环机制由Looper实现。
  • Message是消息数据,表示通信的数据信息
  • MessageQueue是单链表数据结构的消息队列,存放Message列表。

一般情况下在Activity页面异步处理事件结束以后希望更新UI时就会用到Handler:异步子线程希望更新UI线程内容时,通过向主线程Handler发送Message来通知主线程处理事件。

Thread线程

AndroidThread主要用于处理一些耗时操作,例如常用于网络请求、下载资源、加载图片或者上传资源时。另外Android中也有主线程的概念,主线程主要用于处理UI操作,默认也就叫UI线程。当一些耗时操作就不能在UI线程去执行,这样就会导致UI卡顿阻塞主线程事件处理影响用户使用体验,因此耗时操作不能在主线程中执行以避免出现ANR的情况。

HandlerThread

HandlerThread继承Thread,也是一个线程类。

  • HandlerThread内部有Looper对象来进行looper循环。
  • 通过获取HandlerThreadlooper对象传递给Handler对象,可以在handleMessage方法中执行异步任务。
  • 创建HandlerThread后必须先调用HandlerThread.start()方法,Thread会先调用run方法,创建Looper对象。

HandlerThread简单说就是便捷式异步线程创建Handler消息通知功能。因为正常情况下在主线程新建Handler,它的回调方法handlerMessage是在主线程执行而子线程创建的Handler回调方法handlerMessage是在异步线程。其主要是主线程发通知给子线程在子线程中处理消息;和在主线程新建Handler,在子线程发送通知正好相反。

mHandlerThread = new HandlerThread("myThread"); 
mHandlerThread.start(); 
//创建并传入子线程的Looper对象 
Handler mHandlerChild = new Handler(mHandlerThread.getLooper()) {
      @Override
      public void handleMessage(Message msg) {
          //handleMessage回调是在子线程中
          ......
};

Thread缺点

  • 使用new Thread()比较消耗性能
  • new Thread()不利于管控,线程之间会存在竞争关系
  • 不利于扩展、中断以及线程控制

推荐使用线程池来管控子线程使用,可以复用和控制线程开销。保证在有效CPU资源范围内合理良好使用异步处理能力。

总结

Thread()使用场景较为单一,不适用于绝大多数场景。在实际开发中也是推荐使用线程池形式有助于全局管理和监控线程使用。但在一些特殊场景下或许Thread也是一种快速落地和解决问题的一种手段方式。