如何高效学习Handler?

高效学习模型

  • what–>why–>how 模型
  • 是什么?–>为什么运用?–>怎么运用?–>结束原理–>总结同享(学以致用)

一.Handler是什么?

  • Handler是Android供给的一种线程间通讯安全教育渠道的机制

二.为什么运Android用Handler?

1.UI线程模型(了解):
当建议一个运用时,Android体系会打开一个线程来实施这个运用,该线程即为主线程(Main Thread),
该线程是仅有的,担任处理一切的界面显现及用户操作的呼应任务,即担任android.widget和android.view包中一切控件的运用,
因为它担任一切的UI处理作业源码资本,故称为UI线程;
如果UI线程中加入了耗时操作,就会堵塞UI线程,给用android什么意思户带来"死机"的感觉,安全教育日是几月几日故耗时操作有必要新开线程实施,
但Android规则:非UI线程不能访问UI,故而引入了Hanler来进行线程间通讯;
2.该模型中Android做了以下两点规则:
1).不能堵塞UI线程大于5线程池的七个参数s,不然会报ANR过错;
2).不能让非UI线程访问UI,不然会直接报错;
3.Android是运用许多的音讯驱源码分享网动办法来实例化进行交互的,比方四大组件Activity,Service,Broadcast,ContentPr线程的几种状况ovider的建议进程的交互,都离不开音讯机制,
音讯机制触及Handler/Looper/MessageQueue/Message等4个类;
4.UI线程对错线程安全的,为何不规划为线程安全的?
1).UI具有可变性,乃至是高频可变性(如游戏);
2).UI对呼应时间的灵敏性要实例化数组求UI操作有必要高效;
3).UI组件有必要批量来制造来确保功率;

主线程创立及简明代码阐明图:
怎么高效学习Handler?怎么高效学习Handler?
从出产消费模型了解UI线程作业原理图:
怎么高效学习Handler?

三.怎么运用Handler?

Handler handle线程和进程的差异是什么r = new Handler(){
@Override
public void hand实例化目标leMessage(final Message msg) {
//这儿承受并处理音讯安全出产法
}};
//发送音讯
handler.sendMessage(message);
handler.p实例化目标的关键字ost(runnable);

安全教育渠道例化一个Handler并重写 handleMessage办法, 然后在运用的当地调用它的send以及 post系列办法就可以了, 简略易用,并支撑延时音讯。

四.结束原理

图解原理:
怎么高效学习Handler?

代码结束原理:

1.创立Handler, 将Handler安全与Looper相关安全教育日是哪一天起来:

  public实例化目标的关键字 Handler(Callba实例化servlet类反常ck callback, boolean async) {
//检查其时的线程是否有 Looper线程池的七个参数
mLooper = Looper.m实例化yLooper();
if (mLooper == null) {
throw new RuntimeException(线程是什么意思
"Can'android是什么手机牌子t create handler inside thread that has not called Looper.prepare()");
}
//Looper 持有一个 MessageQueue
mQueue = m源码网站L线程池的七个参数ooper.mQueue;
}
结束阐明源码编辑器编程猫下载:
1).android下载将Handler与Looper相关起来,创立Handler之前一源码定要先创立Loope实例化类r,不然会报错;实例化数组
因为ActivityThread(主线程)在main()办法中已经过Looper.prepareMainLooper()创立了Looper政策,
故能经过Looper.myLooper()获取Looper政策;
2).Looper会持有一个MessageQueue;
3).一个结束的Handler应该如下:
class Looper源码之家Thread extends Thread {
publandroid是什么手机牌子ic Handler mHandlandroid的drawable类er;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// proc安全教育日是哪一天ess incoming messa实例化类ges here
}
};
Looper.loop();
}
}
Looper供给了Looper.prepare()办法来创立Looper,
并会凭仗ThreadLocal来结束与其时线程的绑定功用;
Looper.loop()则会初步不断测验从MessageQueue中获取 Message,并分发给对应的Handler;
即Handler跟线程的相关是靠 Looper 来结束的。

2.经过send及post系列办法发送Message, 然后将Message增加进入实例化目标有几种方式MessageQueue

经过send及post系列办法发送音讯,最终会走到 MessageQueue.enqueueMessage(Message,loandroid的drawable类ng)办法。
1).Message:
Message是线程间通讯的信息载体,包含一些特定的描绘和恣意的附加数据;
Message具有setData()和gandroid平板电脑价格etData()办法,它们别离可获取和增加用Bundle政策封装的数据,
这些数据便是线程之间互相传递的数据;
Message政策不建议运用new Message()来获取,可经过Messa.oandroid什么意思btain()或Handler的obtainMassage()办法获线程和进程的差异是什么取;
obtain()可从大局的Messa源码编辑器编程猫下载ge Pool(音讯池)中回来一个M实例化目标是什么意思essage政策;
Message Poolandroid什么意思(音讯池):是android体系专门用来处理音讯的一种机制,
首要是为了避免Message政策频android平板电脑价格频的创立毁掉带来的开支, 故运用音讯池来维护这些政策,
政策运用后可从头放到池中被从头运用,它的巨细是10;
2).MessageQueue:
MessageQueue是一个由Message组成的部队,是一个偏底层的类,
它包含的Message由Looper政策分发出去;
Messag安全教育日是几月几日e并不是直接增加进音讯部队的, 而是经过与Looper相关的MessageQueue.IdleHandler政策增加;
可运用Looper.myQueue()办法取回其时线程源码之家的音讯部队;
Messa安全教育渠道登录ge源码Queue是经过next()办法获取Message的;
//MessageQueue
Messaandroid手机ge next() {
//...
for (;;) {
nativePollOnce(ptr, nextPollTimeoutMillis);
synch实例化一个类roniandroid手机zed (this) {
//...
Message msg = mMessages;
//...
if (msg != null) {
if (安全教育渠道登录进口now < msg.when安全出产法) {
nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE线程池面试题);线程撕裂者
} else {
//...
return msg;
}
}
//...
}
}

图解MessageQueue处理Message:
怎么高效学习Handler?

3.经过Looper.loop()死循环对Message进行获取和分发

Looper:是线程用来运转音讯循环的,线程自身无音讯循环,Android
需求调用Looper.prepare()创立Looper政策,然后调用Landroid什么意思ooper.loop()去处理音讯;线程和进程的差异是什么
Android中体系在建议主线程时会实例化servlet类反常主动为之树立一个Looper源码编辑器政策;
Loandroid体系oper政策经过音讯部队来存放音讯和工作,一个线程只能实例化目标的关键字有一个Looper,对应一个音讯部队;
默许情况下,Handler会与其定义时地址的线程的Looper绑定,如在UI线程中定义,则与UI线程的Looper绑定;
//Looper.loop()源码解读:
public static void loop()线程池的七个参数 {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on线程安全 this thread.");
}
f线程撕裂者inal MessageQueue queue = me.mQueue;
//...
for (;;) {
// 不断从MessageQueue 获取音讯
Message msgandroid什么意思 = queue.ne线程是什么意思xt(); // might block
//退出Loop实例化类er
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
/线程是什么意思/...
try {
msg.target.dispatchMessage(msg);
end = (slowDispatchThresholdMs == 0) ? 0 : SystemClock.up线程和进程的差异是什么timeMillis();
} finally {
//...
}
msg.recycleU线程池nchecked();
}
}
//Handler处理音讯
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
//回调到 Handler 的 hand实例化一个类leMessage 办法
handleMessage(ms实例化类g);
}
}
简明阐明:
1).经过myLooper()获取L安全期计算器oop安全er政策,因Looper持有MessageQueue,然后获取MessageQueue政策;
2).死循环中经过调用queue.next(实例化目标)不断的获取音讯;
3).死循环中通源码时代过调用msg.target.dispatchMessage(msgAndroid)分发音讯音讯,
msg.target即为发送音讯的Handler;
4).dispatchMessage()中调用handleMessage回到UI线程中处理音讯;

五.总结同享

核心调用栈流程:
new Handler-->sendMessage()--&安全教育渠道gt;enqueueMessage()-->Looper实例化目标有几种方式.loop()
--&实例化目标是什么意思gt;queue.next()实例化是什么意思-->msg.target.dispatchMessage()-->handleMessage()
1.创立Handlerandroid下载安装,经过Looper.myLooper()获取Looper政策,因Looper中持有MessageQuandroid平板电脑价格eue然后获取到线程池Messagandroid下载eQueue;
2.经过send及post系列办法发送音讯, 调用enqueueMessandroid下载age()将音讯增加线程是什么意思进MessageQueue;
3.经过Looper.loop()死循环获取安全教育日是几月几日和分发音讯;
4.经过Hander.handleMessage处理音讯;

发表评论

提供最优质的资源集合

立即查看 了解详情