我对以下两种初始化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.
这意味着我想知道更多,比如
退出时,是否有一些特殊操作要做?
哪种方式更好(或效率更高)?
感谢〜
答案 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相关联 当前主题。
由于您的两个班级都是活动,因此在这种情况下没有区别。