Зачем использовать looper в потоке

#android

#Android

Вопрос:

Я нашел эту часть кода, которая использует службу для регистрации LocationListener (lm), которая будет прослушивать изменения местоположения.

В OnStart создается новый поток, потому что в противном случае служба запускалась бы в основном потоке.

Но я не понимаю, зачем мне нужно использовать looper в этом потоке? Кроме того, нужно ли мне как-то это где-то остановить?

И до каких пор выполняется этот поток? Я знаю, что обычно поток завершается, когда завершается его метод run, но что происходит в этом случае? Я предполагаю, что он должен быть запущен постоянно, чтобы location listener мог прослушивать изменения?

 onStart(Intent intent, intstartId) 
{ 
    super.onStart(intent, startId);

    triggerService = new Thread(new Runnable() 
    { 
        public void run() 
        {
            try
            {
                Looper.prepare(); 
                lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                myLocationListener= new GPSListener(); long minTime= 10000; 
                float minDistance= 50; 
                lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, myLocationListener);
                Looper.loop();
            }
            catch(Exception e) 
            { 
                Log.e("MYGPS", e.getMessage() ); 
            } 
       }
 }); 
triggerService.start(); 
}
  

Ответ №1:

Но я не понимаю, зачем мне нужно использовать looper в этом потоке? Кроме того, нужно ли мне как-то это где-то остановить?

Поскольку ваш слушатель будет активирован или прослушает событие на каждом long minTime= 10000;

если это время истекло и на float minDistance= 50; и на minDistance объект перемещается

и когда это происходит, слушатель выполняет свою работу и обновляет местоположение.

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, myLocationListener);

после этого он должен вернуться и установить текущее местоположение и снова дождаться события.

нужно ли мне как-то это где-то остановить?

Вам не нужно останавливать это.

И до каких пор выполняется этот поток?

Этот поток будет выполняться до тех пор, пока вы не завершите работу или не выйдете из службы определения местоположения.

поток завершается, когда его метод run завершен, но что происходит в этом случае? Я предполагаю, что он должен быть запущен постоянно, чтобы location listener мог прослушивать изменения?

Да, этот поток будет выполняться постоянно, или вы остановите его вручную, завершив службу.

Обычно мы используем эти типы потоков для повышения быстродействия программы, чтобы основная программа могла выполнять какую-то другую задачу вместо ожидания службы определения местоположения.

Комментарии:

1. Спасибо за подробный ответ. Что-то меня смущает, что произойдет, если я удалю Looper.loop() и Looper.prepare()? Поток завершится, и я не смогу прослушивать изменения местоположения? Итак, вы говорите, что поток будет выполняться до тех пор, пока я не вызову stopSelf или stopService, это правильно?

2. если вы удалите цикл, поток будет завершен, я говорю для этой ситуации, если вы используете looper, то он не завершится. Если вы удалите looper.loop(), то поток будет закрыт после завершения его работы.

3. Еще один вопрос, если поток без loop() завершится, в каком потоке служба продолжит работу? И будет ли его слушатель реагировать на изменения?

4. служба продолжает выполняться в родительском потоке или главном потоке, и прослушиватель не отвечает, поскольку прослушиватель не запущен, вы заставляете своего listner прослушивать в дочернем потоке.

Ответ №2:

Loopr.prepare() присваивает потоку цикл сообщений. как только у вас есть цикл сообщений, вы можете отправлять в него запросы (которые будут активированы назначенным потоком) с помощью handler.post ().

Но…

С какой стати вы хотите использовать рабочий поток, с циклом msg или без него, чтобы запрашивать обновления местоположения?

Android location notification API — это асинхронный API, который был разработан для активации через поток пользовательского интерфейса. Многие аспекты правильной разработки Android потребуют от вас создания потоков. Не этот.

И в качестве дополнительного примечания, ваш код говорит мне, что вы ищете детализацию местоположения в 50 метров.

Если это так, пожалуйста, рассмотрите возможность использования нового поставщика объединенного местоположения.

Использование объединенного провайдера с приоритетом, установленным на PRIORITY_BALANCED_POWER_ACCURACY, даст вам SLA с погрешностью 40 метров при потреблении батареи ~ 0,6% в час. Намного дешевле, чем использование GPS..

Комментарии:

1. Спасибо за ваш ответ. Мне сказали, что лучше прослушивать эти события в службе, чтобы основной поток не был занят постоянным получением уведомлений. Что-то вроде того, что сказал @ali786 — Обычно мы используем эти типы потоков для повышения быстродействия программы, чтобы основная программа могла выполнять какую-то другую задачу вместо ожидания службы определения местоположения. Я всего лишь новичок в Android, поэтому я не могу сказать, какой подход является хорошим. Что я хочу сделать, так это получить местоположение пользователя при нажатии кнопки, но мне сказали, что я должен слушать это все время, чтобы мне не пришлось ждать исправления местоположения?