У меня есть класс extends 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()
, а затем пытается получить цикл.
В другом классе я создаю экземпляр 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()
)?
HandlerThread
:HandlerThread ht = new HandlerThread("foo");
2) запустить его 3) сделатьHandler
:Handler h = new Handler(ht.getLooper()) {...
4) отправитьMessage
s:h.sendEmptyMessage(999)
- person pskink   schedule 08.10.2015getLooper()
равно NULL? Мой код выглядит так, как если бы я выполнял те же шаги, с той лишь разницей, что я запускаю поток внутри класса. - person user842225   schedule 08.10.2015Handler
/HandlerThread
готовыми, и один, чтобы установитьMessage
s... зачем усложнять? почему вы хотите расширитьHandlerThread
? - person pskink   schedule 08.10.2015initializeSomeObjects
) в вызывающем потоке, сделайте это вprepare
перед запускомHandlerThread
, и если вы хотите сделать это в фоновом потоке, просто переопределитеonLooperPrepared
, который вызывается прямо перед вызовомLooper.loop()
- person pskink   schedule 09.10.2015