问题

1)为何需要多线程?
在android中,在主线程中如果耗时太长会出现ANR(android not
Responding),也就是看起来很卡;
一些下载图片,下载数据等耗时操作需要在其他线程执行。
一句话:避免应用太卡,需要使用多线程。


2)多线程如何实现?
多线程实现方式两种方式:
implements Runnable 或 extends Thread


3)多线程机制的核心是啥?
也可以理解为:线程之间的消息传递
一句话:handler机制
3.1 创建一个Handler时一定要关联一个Looper实例,默认构造方法Handler(),它是关联当前Thread的Looper。
我们在UI Thread中创建一个Handler,那么此时就关联了UI Thread的Looper!

public Handler() {mLooper = Looper.myLooper();
}
//当前线程的Looper,在Activity创建时,UI线程已经创建了Looper对象//在Handler中机制中Looper是最为核心的,它一直处于循环读MessageQueue,有//要处理的Message就将Message发送给当前的Handler实例来处理

3.2 在创建一个Handler的时候也可以指定Looper,此时的Looper对象,可以是当前线程的也可以是其它线程的!
Handler只是处理它所关联的Looper中的MessageQueue中的Message,至于它哪个线程的Looper,Handler并不是很关心!

我们可以在UI线程中创建一个Handler同时传入Worker的Looper???????

3.3 可Handler到底干了啥呢?简要说明如下:

Activity所在的UI线程在创建的时候,就关联了Looper和MessageQueue,那么我们又在UI线程里创建了自己的Handler,那么Handler是属于UI线程的,从而它是可以和UI线程交互的!
UI线程的Looper一直在进行Loop操作MessageQueue读取符合要求的Message给属于它的target即Handler来处理!所 以啊,我们只要在Worker线程中将最新的数据放到Handler所关联的Looper的MessageQueue中,然而Looper一直在loop 操作,一旦有符合要求的Message,就第一时间将Message交给该Message的target即Handler来处理!所以啊,我们在创建 Message的时候就应该指定它的target即Handler!

3.4 消息发送有哪几种方法?

但我们也可以,new Message() -- > mHandler.sendMessage(msg) ;这是特例!如果我们通过obtainMessage()方法获取Message对象,此时Handler就会自动设置Message的target。可以看源码!

简单一点说就是:

UI线程或Worker线程提供MessageQueue,Handler向其中填Message,Looper从其中读Message,然后交由 Message自己的target即Handler来处理!!最终被从属于UI线程的Handler的handlMessag(Message msg)方法被调用!!

这就是Android多线程异步处理最为核心的地方!!

3.5 注意点:
(1)在UI线程中创建Handler[一般继承HandleMessage(Message msg)]
(2)Looper可以属于UI线程或Worker线程
(3)从属于Looper的MessgeQueue,Looper一直在loop()操作,在loop()中执行msg.target.dispatchMessage(msg);调用Handler的handleMessage(Message msg)

在创建一个Looper时,就创建了从属于该Looper的MessageQueue
private Looper() {mQueue = new MessageQueue();mRun = true;mThread = Thread.currentThread();}

(4)在 Worker线程中获取Message,然后通过Handler传入MessageQueue
(5)handler处理消息。


4)到底有多少种实现方式?

4.1 在异步线程操作UI控件

利用handler

handler.sendMessage(message)-----------handleMessage方法回调

4.2 控件自己本身操作

textview.post(Runnable action)
textview.postDelay(Runnable action , long miliseconds)

4.3 activity的调用方法
runOnUiThread(Runnable action)

public final void runOnUiThread(Runnable action) {if (Thread.currentThread() != mUiThread) {//如果当前线程不是UI线程mHandler.post(action);} else {action.run();}}其中:mUiThread = Thread.currentThread() ;mHandler = new Handler()

4.4 AsyncTask(在UI线程中、只能实例化一次的)

onPreExecute() --在UI线程中执行,作一些初始化操作
doInBackground(Params... params) --在Worker线程中执行,进行耗时的后台处理,在该方法中可以调用publishProgress(Progress progress) 进行进度处理
onProgressUpdate(Progress progress) --在UI线程中执行,进行进度实时处理
onPostExecute(Result result) --在UI线程中执行, 在doInBackground(Params ... params)返回后调用
onCancelled() --在UI线程中执行,在AsyncTask实例调用cancle(true)方法后执行,作一些清理操作

注意点


AsyncTask必须在UI线程中创建,asyncTask.execute(Params... params) ;在UI线程中执行,且只能执行一次要想再次调用execute(Params... params),必须重新创建AsyncTask对象

遗留问题

  1. handler从消息队列轮询处理消息,当消息处理完了会怎样?
  2. AsyncTask优缺点有哪些?
    优点是解决了多线程处理问题
    缺点是每处理一个任务需要一个新的实例来执行
  3. 当同一时间有很多耗时操作时,需要new thread很多实例,任务执行完成后,会被虚拟机垃圾回收gc,降低程序性能。
    原理:当频繁创建销毁某个类型的对象实例时,会产生很多临时对象,当失去引用的临时对象较多时,就会gc。
    如何自定义线程池来处理这一个问题?
  4. 我们可以在UI线程中创建一个Handler同时传入Worker的Looper,那么handler处理消息是来自UI线程还是worker线程,还是两个都处理?
  5. 用一张图来阐述handler原理?

Android多线程机制相关推荐

  1. Android多线程:深入分析 Handler机制源码(二)

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 接下来,深入分析 Handler机制的源码,希望加深理解 目录 1. Handler 机制简介 定义 一套 Android 消 ...

  2. Android多线程----异步消息处理机制之Handler

    虽然是国庆佳节,但也不能停止学习的脚步,我选择在教研室为祖国母亲默默地庆生. 关于Android的多线程知识,请参考本人之前的一篇博客:Android 多线程----AsyncTask异步任务详解 在 ...

  3. android多线程的本质,[原创]分析unidbg(unidbgMutil)多线程机制

    unidbg多线程分析 一. 概述 由于在工作中遇到了某翻译so中有多线程调用,因此使用unidbg分析(基于unidbgMutilThread)并增加阻塞唤醒机制(futex系统调用),但仍未调用成 ...

  4. Dalvik/ART(ANDROID)中的多线程机制(3)

    封装任务 Message 在整个消息处理机制中,message又叫task,封装了任务携带的信息和处理该任务的handler.message的用法比较简单,这里不做总结了.但是有这么几点需要注意(待补 ...

  5. Dalvik/ART(ANDROID)中的多线程机制(2)

    Android消息处理机制(二) 角色综述(回顾): (1)UI thread通常就是main thread,而Android启动程序时会替它建立一个MessageQueue. (2)当然需要一个Lo ...

  6. Android消息处理机制

    Google参考了Windows的消息处理机制,在Android系统中实现了一套类似的消息处理机制.学习Android的消息处理机制,有几个概念(类)必须了解: 1.       Message 消息 ...

  7. 理解Android Binder机制(1/3):驱动篇

    Binder的实现是比较复杂的,想要完全弄明白是怎么一回事,并不是一件容易的事情. 这里面牵涉到好几个层次,每一层都有一些模块和机制需要理解.这部分内容预计会分为三篇文章来讲解.本文是第一篇,首先会对 ...

  8. Android消息机制基本原理和使用

    在Android开发过程中,我们常常遇到子线程更新UI的需求,例如在子线程进行耗时较长的下载,等下载完成之后,再去更新UI,提示用户下载完成,直接在子线程里更新UI,会得到报错提示:Only the ...

  9. Android多线程源码学习笔记一:handler、looper、message、messageQueue

    最近在学习Android多线程相关知识的源码,现在把自己的笔记整理一下,写出来加深印象. Android多线程通讯的核心是handler.looper.message.messageQueue,这篇文 ...

最新文章

  1. RFID系统的基本工作原理
  2. 数据结构问题集锦 - Find Median from Data Stream
  3. js获取session_学习后端鉴权系列: 基于Cookie, Session认证
  4. 机器学习、深度学习教程和代码资源帖
  5. 两个iOS应用之间的跳转
  6. Mac 软件使用心得 极简软件清单
  7. 购物车代码(html+css)
  8. mPaaS 月度小报|魔方卡片(Cube)公测,十个卡片模板任意使用
  9. PySpark 之 连接变换 union、intersection、subtract、cartesian
  10. 第三方推广——《互联网运营的知识体系与整体逻辑》笔记(十二)
  11. LaTeX升级打怪路之自定义指令篇1
  12. maya建模与骨骼动画快速实现人工鱼
  13. 生产计划管理APS系统在食品调味品/复合调味品行业的应用(2)--APS系统功能介绍
  14. 微型计算机只要性能指标,微型计算机的主要性能指标运算速度.ppt
  15. 集群并行效率测试软件,并行集群系统的Linpack性能测试分析
  16. 手机上所部署的DigiCert证书过期怎么办
  17. 读书笔记-----跟任何人都聊得来
  18. QA的职责和角色定位
  19. HDU1234 开门人和关门人
  20. CCNA学习笔记10-OSPF

热门文章

  1. 斯坦福php项目怎么样,科学网—发现自己的论文居然成了斯坦福大学的课程项目 - 杨双的博文...
  2. 解决word插入(粘贴)图片不能显示的问题
  3. IntelliJ IDEA中文插件
  4. 表情包小程序完整版源码 后台API+前端
  5. SCADA系列 系统评估
  6. lyapunov指数的matlab仿真,输出lyapunov指数收敛曲线
  7. 一毕业就失业?应届生错过秋招有多难受
  8. UVALive 4950 Selling Land
  9. java并发编程实战wwj----------------------第一阶段--------------35-36-37-38-39
  10. java并发编程实战wwj----------第三阶段-------------CompletableFuture---------------56-59