1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android子线程创建Handler方法

Android子线程创建Handler方法

时间:2024-07-09 19:13:53

相关推荐

Android子线程创建Handler方法

如果我们想在子线程上创建Handler,通过直接new的出来是会报异常的比如:

[java]view plaincopy newThread(newRunnable(){publicvoidrun(){Handlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){Toast.makeText(getApplicationContext(),"handlermsg",Toast.LENGTH_LONG).show();}};handler.sendEmptyMessage(1);};}).start();

会报错:

01-12 02:49:31.814: E/AndroidRuntime(2226): Java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

1.方法1(直接获取当前子线程的looper)

既然它说要Looper.prepare(),那我们就给他prepare()咯

[java]view plaincopy newThread(newRunnable(){publicvoidrun(){Looper.prepare();//此处获取到当前线程的Looper,并且prepare()Handlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){Toast.makeText(getApplicationContext(),"handlermsg",Toast.LENGTH_LONG).show();}};handler.sendEmptyMessage(1);};}).start();

然后我们再运行,发现不报错了,但是handleMessage内的代码没执行,因为还差重要的一步,Looper.loop();最终代码是

[java]view plaincopy newThread(newRunnable(){publicvoidrun(){Looper.prepare();Handlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){Toast.makeText(getApplicationContext(),"handlermsg",Toast.LENGTH_LONG).show();}};handler.sendEmptyMessage(1);Looper.loop();};}).start();

这样就OK了

2.方法2(获取主线程的looper,或者说是UI线程的looper)

这个方法简单粗暴,不过和上面的方法不一样的是,这个是通过主线程的looper来实现的

[java]view plaincopy newThread(newRunnable(){publicvoidrun(){Handlerhandler=newHandler(Looper.getMainLooper()){//区别在这!!!!@OverridepublicvoidhandleMessage(Messagemsg){Toast.makeText(getApplicationContext(),"handlermsg",Toast.LENGTH_LONG).show();}};handler.sendEmptyMessage(1);};}).start();

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。