Как настроить обработчик / лупер для вызова requestLocationUpdates в обратном вызове службы - PullRequest
0 голосов
/ 10 января 2020

У меня есть служба, которая создает экземпляр веб-сервера, используя com.koushikdutta.asyn c .AsyncHttpServer . Внутри обратного вызова мне нужно создать экземпляр класса, который вызывает requestLocationUpdates в LocationManager. Но это вызывает исключение:

Can't create handler inside thread that has not called Looper.prepare() 

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

Handler handler = new Handler();
final GPSListener gps;
handler.post(new Runnable() {
    @Override
    public void run() {
        gps = new GPSListener(ctx,ews);
    }
})

Этот код находится в обратном вызове в ответ на запрос HTTP. Но есть непосредственная проблема. Я не могу использовать переменную gps в Runnable, если она не объявлена ​​как final. Но если я объявляю его окончательным вне Runnable, то это говорит мне, что я не могу инициализировать его, так как он окончательный. Но я не могу инициализировать его вне Runnable, потому что весь смысл помещения его в Runnable состоит в том, чтобы избежать исключения, вызванного попыткой конструктора попытаться вызвать requestLocationUpdates вместо потока, который не вызвал Looper.prepare (). Кроме того, эта gps переменная также должна находиться за пределами Runnable, потому что другой обратный вызов (при закрытии соединения) должен вызывать другую функцию для ее отключения. Кроме того, переменная должна быть локальной для обратного вызова, потому что она должна отдельно создавать экземпляр нового объекта каждый раз, когда вызывается обратный вызов.

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

Ответы [ 2 ]

0 голосов
/ 10 января 2020

AndroidSyn c является однопоточным, поэтому настройка петлителя в потоке, который вы создаете, не будет работать в любом случае. В обратном вызове создайте новый поток, подготовьте петлитель, а затем, после запуска двигателя GPS, запустите l oop:

final Thread t = new Thread() {
    @Override
    public void run() {
        Looper.prepare();
        gps.start((long)mint,(float)mind,sat!=0);
        Looper.loop();
     }
};
0 голосов
/ 10 января 2020

Как я понял, вы запускаете Сервис из другого потока, не так ли? Для того, чтобы это работало, вы должны вызвать Looper.prepare () перед созданием вашего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...