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 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog