Могу ли я получить неблокирующий 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.

Надеюсь, поможет.

Другие вопросы по тегам