У меня есть служба, которая создает экземпляр веб-сервера, используя 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, потому что другой обратный вызов (при закрытии соединения) должен вызывать другую функцию для ее отключения. Кроме того, переменная должна быть локальной для обратного вызова, потому что она должна отдельно создавать экземпляр нового объекта каждый раз, когда вызывается обратный вызов.
Я не уверен, каким образом я пытаюсь настроить обработчик это даже правильно, и если это так, как я могу обойти вышеупомянутые проблемы?