【发布时间】:2016-01-06 08:36:42
【问题描述】:
我有一个类扩展HandlerThread,它看起来像这样:
public class MyHandlerThread extends HandlerThread {
private Object lock;
//constructor
public MyHandlerThread() {
super(“MyHandlerThread”);
lock = new Object();
}
public void prepare() {
//starts the handler thread
start();
//Wait for thread starting
Log.d(TAG, "wait for thread starting…");
synchronized (lock) {
try {
lock.wait(5000);
} catch (InterruptedException e) {
Log.e(TAG, "Failed to wait for thread to start");
}
}
//WHY getLooper() returns null here?
if(getLooper() == null) {
Log.d("GET LOOPER NULL!");
}
}
@Override
public void run() {
Log.d("run() begin...");
initializeSomeObjects()
Log.d(“initialise objects done!”);
//Notify that run() finished
synchronized (lock) {
lock.notify();
}
Log.d("run() end!”);
}
}
正如你在上面看到的,prepare() 函数启动线程并等待run() 完成,然后尝试获取 looper。
在另一个类中,我创建了一个 MyHandlerThread 的实例并启动它:
MyHandlerThread myThread = new MyHandlerThread();
myThread.prepare();
控制台中显示的日志:
wait for thread starting…
run() begin...
initialise objects done!
run() end!
GET LOOPER NULL!
为什么在prepare()函数中,调用getLooper()返回null,虽然线程已经启动(run()被执行)?
【问题讨论】:
-
1) 创建一个新的
HandlerThread:HandlerThread ht = new HandlerThread("foo");2) 启动它 3) 制作一个Handler:Handler h = new Handler(ht.getLooper()) {...4) 发送Messages:h.sendEmptyMessage(999) -
谢谢,我在谷歌找到了同样的东西,但为什么我的方法
getLooper()是NULL?我的代码看起来像执行相同的步骤,唯一的区别是我在类中启动线程。 -
确实有 3 个步骤可以让
Handler/HandlerThread准备就绪,还有一个步骤可以设置Messages... 为什么要让它变得更难?为什么要扩展HandlerThread? -
我很想知道背后的原因。这是一种了解下面发生的事情的方法,不是吗?简单地让它工作不是我的意思,这就是为什么我说我也通过谷歌找到了你的建议。
-
所以如果你想知道下面是什么,那么看看here
标签: android android-handler android-looper android-handlerthread