Могу ли я получить неблокирующий Looper?
У меня есть тема с сообщением-Looper для некоторых вычислений местоположения. Для этого я звоню:
LocationManager.requestLocationUpdates(mProvider, mMinTime, mMinDistance, (LocationListener)this, looper);
Чтобы получить действительный объект Looper, я подготавливаю свою тему следующим образом:
Looper.prepare();
mLooper = Looper.myLooper();
handler = [...]
Looper.loop();
Но возможно ли как-то иметь дополнительный цикл while для обработки данных в том же потоке?
Вероятно, я могу каким-то образом получить свой собственный Looper и обработать сообщения вручную, но как?
1 ответ
Там нет необходимости в такой вещи.
Когда вы вызываете Looper.loop(), поток запускает очередь сообщений своего обработчика. Таким образом, любое сообщение или сообщение, полученное Обработчиком, будет обработано в потоке Looper.
Как это:
Thread t1 = new Thread(new Runnable()
{
@Override
public void run() {
Looper.prepare();
final Handler h = new Handler();
final boolean isRunning = true;
Thread t2 = new Thread(new Runnable() {
@Override
public void run()
{
//Do stuff like download
h.post(new Runnable() {
@Override
public void run() {
//Post stuff to Thread t1
}
});
isRunning = false;
h.getLooper().quit();
}
}
while(isRunning)
{
//This will ensure that the messages sent by the Handler, be called inside the Thread
Looper.loop();
}
}
}
Таким образом вы гарантируете, что поток продолжает работать в течение времени, необходимого для ответа на сообщения и обратные вызовы обработчика. Вы также можете расширить Handler с помощью своих собственных методов handleMessage, и они также будут вызываться внутри потока t1.
Надеюсь, поможет.