每个线程只有一个loop线程的理解
2016-04-29 本文已影响1553人
Jsonjia
眼看四月底了,然后今天也是五一小长假的前一天,我想大家都坐不住了吧。出去玩的出去玩,回家的回家,然而总有一批任劳任怨的工程师奋战在一线,哈哈,我就是其中的一位~
代码
/**
* 显示吐司
*/
public static void showToast(Context context , String str){
boolean canLooper = true;
Looper.prepare();
if(context != null)
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
else
Toast.makeText(ZjpTopLanApplication.getInstance(),str,Toast.LENGTH_SHORT).show();
if(canLooper)
Looper.loop();
}
然后我们调用这个方法,会报如下错误:
error图.png意思就是说,每个线程中只有一个Looper。
我们都知道,只有主线程(即UI线程)可以直接调用Handler,因为主线程是有looper的,其他线程中调用,必须初始化looper。上面代码中我们虽然初始化了looper,但是始终是一个线程,每次线程走里面这个方法会走一步looper,然而,如果looper已经存在了,还走这个方法,会再次初始化looper,就造成如上图异常了,具体解决方案,如下:
/**
* 显示吐司
*/
public static void showToast(Context context, String str){
try {
boolean canLooper = true;
try{
Looper.prepare();
}catch (Exception e) {
canLooper = false;
}
if(context != null)
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
else
Toast.makeText(ZjpTopLanApplication.getInstance(),str,Toast.LENGTH_SHORT).show();
if (canLooper) {
Looper.loop();
}
}
}
这样就保证了一个线程就只有一个looper了,因为如果执行一遍线程运行 Looper.prepare() 后,线程中有looper了,再次执行这个方法,直接会抛异常,这样canLooper就会为false了,接下来往下走就不会执行Looper.loop()了,好了,大功告成!
祝大家五一嗨皮~