java.lang.RuntimeException: Can't create handler inside thread that has not
2015-10-21 21:06
429 查看
在很多时候都需要异步获取数据刷新UI控件,这时候采取的方法就是Handler消息机制和AsyncTask异步任务两种解决方法。
首先是引起异常的例子:
上面例子在线程里面休眠1秒后吐司消息,然后出现java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()异常。
正确的方法应该是:
重写Handler对象中的handlerMessage方法进行你需要的处理。
当然不是只有这一种方法可以实现我们的需要,
runOnUiThread(Runnable action) Activity中带有的方法,运行指定的action在UI线程中,如果当前线程是UI线程,那么action立即执行。如果当前线程不是UI线程,那么action将发送事件到UI的消息队列中。
View post(Runnable aciton);
View postDelayed(Runnable action,
long
delayMillis);
这两个方法也是同样的道理。
下面是异步任务的处理:
onProgressUpdate方法的执行在收到publishProgress方法调用后,运行于UI线程中,对UI控件进行处理,例如,我们做的下载,需要显示下载到了百分之多少时,可以不停的publishProgress(Value value),然后在进度条中更新。
onPostExecute()方法,在doInBackground()方法结束后运行在UI线程,对result进行处理
doInBackground()方法中,就是在后台线程中处理我们的异步任务,不能做类似Toast的操作,同样会出java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()异常。
首先是引起异常的例子:
new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { Thread.sleep(1000); Toast.makeText(getApplicationContext(), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0).show(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start();
上面例子在线程里面休眠1秒后吐司消息,然后出现java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()异常。
正确的方法应该是:
new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { Thread.sleep(1000); handler.sendEmptyMessage(0); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start();
private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0).show(); } };
重写Handler对象中的handlerMessage方法进行你需要的处理。
当然不是只有这一种方法可以实现我们的需要,
runOnUiThread(Runnable action) Activity中带有的方法,运行指定的action在UI线程中,如果当前线程是UI线程,那么action立即执行。如果当前线程不是UI线程,那么action将发送事件到UI的消息队列中。
View post(Runnable aciton);
View postDelayed(Runnable action,
long
delayMillis);
这两个方法也是同样的道理。
下面是异步任务的处理:
private class MyTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub publishProgress(); return null; } @Override protected void onProgressUpdate(Void... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); try { Thread.sleep(1000); Toast.makeText(getApplicationContext(), "doInBackground", 0).show(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "onPostExecute", 0).show(); super.onPostExecute(result); } }
onProgressUpdate方法的执行在收到publishProgress方法调用后,运行于UI线程中,对UI控件进行处理,例如,我们做的下载,需要显示下载到了百分之多少时,可以不停的publishProgress(Value value),然后在进度条中更新。
onPostExecute()方法,在doInBackground()方法结束后运行在UI线程,对result进行处理
doInBackground()方法中,就是在后台线程中处理我们的异步任务,不能做类似Toast的操作,同样会出java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()异常。
相关文章推荐
- 记我遇到的神奇BUG
- 深入理解java异常处理机制
- java一步一脚印—java基本类型的读写
- java8笔记二
- PEKING ACM ID1000 --JAVA的输入输出
- java递归
- Loding Images(懒加载图片)
- Java ThreadLocal的使用
- Struts2内置拦截器和自定义拦截器
- Struts2中的OGNL详解
- 按权重给小孩分糖果,笔试题。
- Java语言程序设计(基础篇)原书第十版 课后习题 第五章
- java中String类的常用方法
- JDK目录文件说明
- eclipse ant 打包 apk
- 如何优化Java垃圾回收机制3
- java万年历
- 如何监控Java垃圾回收机制2
- JAVAEclipse使用学习总结
- 关于Struts、Hibernate、Spring的简单理解