Как использовать Looper в requestLocationUpdates?

Я новичок в Android-разработке. Я создаю небольшое приложение, которое делает снимок после того, как устройство достигает определенной скорости. Однако для одного из параметров метода requestLocationUpdates (который, конечно, используется для отслеживания местоположения пользователя) требуется Looper в третьем параметре. Как бы я создал лупер? И куда оно должно идти? Мой метод requestLocationUpdates в настоящее время выглядит так: (у меня есть null вместо Looper)

 protected void requestUpdates() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            MC.requestLocationUpdates(locRequest, mLocationCallback, null);
        }
    }

Сайт разработчиков Android посоветовал сделать что-то вроде этого:

 class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
      Looper.prepare();

      mHandler = new Handler() {
          public void handleMessage(Message msg) {
              // process incoming messages here
          }
      };

      Looper.loop();
      }
  }

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


person Daniel    schedule 03.02.2018    source источник
comment
Однако одним из необходимых параметров является Looper. Для получения местоположения Looper не требуется. Можете ли вы уточнить, для чего требуется Looper?   -  person Sharp Edge    schedule 03.02.2018
comment
Для третьего параметра метода requestLocationUpdates требуется Looper. Я уточнил это и в вопросе. Спасибо за комментарий.   -  person Daniel    schedule 03.02.2018
comment
Есть много версий requestLocationUpdates(). Вы, вероятно, захотите использовать тот, который принимает LocationListener в качестве параметра. Looper не требуется.   -  person Markus Kauppinen    schedule 03.02.2018


Ответы (3)


Как сказал @Markus в своих комментариях, вам, вероятно, потребуется передать this, если ваш Activity реализовал интерфейс LocationListener. Это третий параметр, который вам понадобится вместо Looper.

person Sharp Edge    schedule 04.02.2018

Создайте петлитель, следуя коду.

    HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
    handlerThread.start();
    // Now get the Looper from the HandlerThread
    // NOTE: This call will block until the HandlerThread gets control and initializes its Looper
    Looper looper = handlerThread.getLooper();

и передайте объект петлителя в requestLocationUpdates() как peramiter следующим образом.

MC.requestLocationUpdates(locRequest, mLocationCallback, looper); 
person Samarth patel    schedule 04.02.2018

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

Цитируя документацию, вы должны передать

объект Looper, чья очередь сообщений будет использоваться для реализации механизма обратного вызова, или нуль для выполнения обратных вызовов в вызывающем потоке

Если вы вызовете requestLocationUpdates в основном потоке и передадите null как Looper, вы получите обратные вызовы в основном потоке.

Вы не можете получить доступ к сети из основного потока и не должны выполнять какие-либо операции ввода-вывода в основном потоке. Ваш пользовательский интерфейс начнет отставать.

person Eugen Pechanec    schedule 04.02.2018