A-Liang 2017-07-19 12:34 采纳率: 14.3%
浏览 2144

吐槽:子线程中创建Handler对象就很牛逼么?效率就很高么?使用起来就很方便么?

很多面试题问到“子线程中能否创建Handler?”。
之前一直使用HandlerThread框架,在主线程中创建与子线程关联的Handler实例,也没考虑过这个问题。

代码如下:

HandlerThread  mHandlerThread = new HandlerThread("Controller Message Processing Thread");
mHandlerThread.start();
Looper  mServiceLooper = mHandlerThread.getLooper();
Handler mMessageHandler = new Handler(mServiceLooper) {
        @Override
        public void handleMessage(Message msg) {

        }
 };

针对“子线程中能否创建 Handler实例?”基本上就是说直接new Handler()无参数实例,
看源码,使用无参构造函数时确实有抛出异常的可能:

public Handler() {
    this(null, false);
}
public Handler(Callback callback, boolean async) {
      mLooper = Looper.myLooper();
      if (mLooper == null) {
          throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
}

结论:在创建Handler之前,必须在子线程中调用Looper.prepare(),否则就抛出异常。
总觉得这样的面试题有些傻x,考察点难道就是如上的结论?
可是完全也没必要非得在子线程中创建Handler实例啊,在主线程完全可以完成所有的事情,解决所有的问题,完全可以不去踩这个坑的,你踩过一次坑,别人必须也得踩过才是熟练使用,没踩过就就是大笨蛋?
得出结论:这类面试题说明你踩过的坑别人没踩过就是蠢货......

  • 写回答

4条回答 默认 最新

  • oyljerry 2017-07-19 13:57
    关注

    其实主要就是考察你对他们区别的理解。
    http://www.cnblogs.com/xgjblog/p/5258947.html

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable