在子线程中new一个Handler为什么会报以下错误?

java.lang.RuntimeException: 

Can't create handler inside thread that has not called Looper.prepare() 

这是因为Handler对象与其调用者在同一线程中,如果在Handler中设置了延时操作,则调用线程也会堵塞。每个Handler对象都会绑定一个Looper对象,每个Looper对象对应一个消息队列(MessageQueue)。如果在创建Handler时不指定与其绑定的Looper对象,系统默认会将当前线程的Looper绑定到该Handler上。
在主线程中,可以直接使用new Handler()创建Handler对象,其将自动与主线程的Looper对象绑定;在非主线程中直接这样创建Handler则会报错,因为Android系统默认情况下非主线程中没有开启Looper,而Handler对象必须绑定Looper对象。这种情况下,则有两种方法可以解决此问题:

方法1:需先在该线程中手动开启Looper(Looper.prepare()-->Looper.loop()),然后将其绑定到Handler对象上;

final Runnable runnable = new Runnable() {
  @Override
  public void run() {
    //执行耗时操作
    try {

      Log.e("bm", "runnable线程: " + Thread.currentThread().getId()+ " name:" + Thread.currentThread().getName());

      Thread.sleep(2000);
      Log.e("bm", "执行完耗时操作了~");
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
  }
};
new Thread() {
  public void run() {
    Looper.prepare();
    new Handler().post(runnable);//在子线程中直接去new 一个handler
    Looper.loop();    //这种情况下,Runnable对象是运行在子线程中的,可以进行联网操作,但是不能更新UI
  }
}.start();

方法2:通过Looper.getMainLooper(),获得主线程的Looper,将其绑定到此Handler对象上。

final Runnable runnable = new Runnable() {
  @Override
  public void run() {
    //执行耗时操作
    try {

      Log.e("bm", "runnable线程: " + Thread.currentThread().getId()+ " name:" + Thread.currentThread().getName());
      Thread.sleep(2000);
      Log.e("bm", "执行完耗时操作了~");
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
  }
};
new Thread() {
  public void run() {
    new Handler(Looper.getMainLooper()).post(runnable);//在子线程中直接去new 一个handler

    //这种情况下,Runnable对象是运行在主线程中的,不可以进行联网操作,但是可以更新UI
  }
}.start();

我以为我只是个程序猿,其实我是只程序狗……

最新文章

  1. UML图示说明
  2. Android notification的使用
  3. 暴力枚举 + 24点 --- hnu : Cracking the Safe
  4. if..elif语句
  5. 510C
  6. Linux文件系统(inode、block……)
  7. Undefined symbols for architecture i386: "_deflate", referenced from:
  8. functional cohesion
  9. 01scala环境搭建和基础
  10. mysql装载本地文件及模式匹配
  11. PHP QR CODE生成二维码
  12. bzoj 3874: [Ahoi2014]宅男计划
  13. 【CF850E】Random Elections(FWT)
  14. sliding menu
  15. URAL 2072 Kirill the Gardener 3
  16. 不能错过的Sketch实用新技巧和资源集锦
  17. 第一篇:一天学会MongoDB数据库之Python操作
  18. 截屏快捷键(windows)自带截屏,不需要安装任何插件
  19. 5. CSS是什么
  20. Eclipse插件--一次copy多个文件的相对路径路径

热门文章

  1. 跟微软保持适当距离--Hessian + .net 实现RPC体系的企业应用
  2. Linux驱动框架之misc类设备驱动框架
  3. curl:get,post 以及SoapClien访问webservice数据
  4. Class 'App\Http\Controllers\DB' not found and I also cannot use a new Model
  5. java try catch finally return执行
  6. 23 DesignPatterns学习笔记:C++语言实现 --- 2.7 Proxy
  7. struts中request传递中文乱码问题
  8. TSQL--聚合函数
  9. .net后台转json数据
  10. 热更新(一) 之Lua语法的学习