looper.prepare get()!=null){
Looper用于封装了android线程中的消息循环。默认情况下一个线程是不存在消息循环(message loop)的,须要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用。从消息队列里取消息。处理消息。注:写在Looper.loop()之后的代码不会被马上执行。当调用后mHandler.getLooper().quit()后。loop才会中止,其后的代码才干得以执行。
Looper对象通过MessageQueue来存放消息和事件。一个线程仅仅能有一个Looper。相应一个MessageQueue。
下面是Android API中的一个典型的Looper thread实现:
//Handler不带參数的默认构造函数:new Handler()。实际上是通过Looper.myLooper()来获取当前线程中的消息循环,
//而默认情况下。线程是没有消息循环的,所以要调用 Looper.prepare()来给线程创建消息循环,然后再通过。Looper.loop()来使消息循环起作用。
另,Activity的MainUI线程默认是有消息队列的。
所以在Activity中新建Handler时,不须要先调用Looper.prepare()。
那么遇到了有多Low的问题呢:
项目中重写了一个HandlerThread,然后定义了post方法。然后在主线程中例如以下实现:
AsyncHandler.post(new Runnable() {
@Override
public void run() {
try {
Looper.prepare();
// 一坨要异步运行的代码******
Looper.loop();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
那么明 人一看就看出问题来了 ,这代码一跑异步代码肯定运行不到啊。为啥呢。且看下prepare的实现:
public static void prepare() {
prepare(true);
}
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() !=null) {
throw new RuntimeException( Only one Looper may be created per thread
}
sThreadLocal.set(new Looper(quitAllowed));
}
So,简单,却是问题~
相关文章
猜你喜欢
-
美的风扇?说明书看不懂
风扇买回家了,怎么安装也是个难题,用久了想清洗,却不知道怎么拆卸,说明书看不懂,问客服说不清,找人帮忙又不好意思,别急,几张简易图示,手把手教你安装和拆卸,分分...
-
智性恋?一个人喜欢另外一个人
网络上有很多关于爱情的梗,其中有一个叫作智性恋,不过很多人第一次看到的时候,都不知道智性恋是什么梗,不知道智性恋到底是什么意思。智性恋单看字面意思也是很难理解的...
-
繁体字网名设计?半城烟沙自寂寥
1.形容一个人挺好的网名2.好听的单字繁体字网名3.独一无二繁体字网名女4.女生qq网名繁体字霸气形容一个人挺好的网名 提起繁体字一个人挺好的网名,大家都...
-
曾志伟蓝洁瑛是怎么回事?还依然过得非常好
曾志伟和蓝洁瑛怎么了,蓝洁瑛的不幸据说来自于曾志伟。有的时候人什么事情都没有做,不幸就发生了,制造不幸的这个人不仅受到任何的惩罚,还依然过得非常好。但是承担不幸...
-
象人读后感?每天工作12小时
象人读后感(1): 以前有个很丑陋的人叫:约瑟夫。梅里克,人们全都笑话他,叫他象人,正因疾病他的鼻子长长的,耳朵大大的,像大象一样,一个商店老板拿他做展览...