两种初始化Handler的方法有什么区别?

时间:2013-12-27 10:06:04

标签: android android-handler

我对以下两种初始化Handler的方法感到困惑。 有什么区别?

1。第一种方式:

class MyFirstActivity extends Activity {
    class Handler mHandler = new Handler();
    ...
}

2。第二种方式:

class MySecondActivity extends Activity {

    private MyHandler mHandler;

    @Oerride
    protected void onCreate(Bundle bundle) {
        mHandler = new MyHandler(getMainLooper());
    }

    private final class MyHandler extends Handler {
        public MyHandler(Looper looper) {
            super(looper, null, true);
        }
        ...
    }
}

注意: 我知道有documentation

Handler() - Default constructor associates this handler with the Looper for the current thread.
If this thread does not have a looper, this handler won't be able to receive messages so an exception is thrown.
and
Handler(Looper looper) - Use the provided Looper instead of the default one.

这意味着我想知道更多,比如

  1. 退出时,是否有一些特殊操作要做?

  2. 哪种方式更好(或效率更高)?

  3. 感谢〜

3 个答案:

答案 0 :(得分:2)

从线程创建Handler时使用Handler (Looper looper)构造函数(第二种方式),这些线程没有默认循环器,或者您希望处理程序在与你自己不同的主题。

在你的“第二种方式”示例中,不需要使用这种类型的构造函数,default one也会这样做。由于活动constructor在与onCreate(..)方法相同的线程上调用,Handler的两种可能的初始化(“第一种”和“第二种方式”)完全相同。

UPD:确保not to create inner处理程序类。

答案 1 :(得分:0)

根据文件here

  

Handler() - 默认构造函数将此处理程序与   当前线程的Looper。

     

如果此线程没有looper,则此处理程序将无法接收消息,因此会抛出异常。

     

     

Handler(Looper looper) - 使用提供的Looper而不是默认的Looper。

此处 Looper 是用于为线程运行消息循环的类。查看this

答案 2 :(得分:-1)

这是documented here。基本上第二个示例显式尝试获取应用程序的主要循环,而第一个示例将其留给Handler的构造函数:

  

默认构造函数将此处理程序与Looper相关联   当前主题。

由于您的两个班级都是活动,因此在这种情况下没有区别。