LocationManager и Looper - для одного потока может быть создан только один Looper
У меня проблема с моим приложением. Мне нужно получать обновления местоположения через определенные промежутки времени и, следовательно, в основном нужно уметь управлять модулем GPS довольно хорошо, с ОС Android это не совсем легко. В основном мне нужно включить GPS на 2 минуты с интервалом 5 минут. У меня нет времени, и я могу получить местоположение дважды, но затем приложение вылетает с ошибкой RunTime - только один Looper может быть создан для потока. Синхронизация выполняется в классе обслуживания и работает хорошо, он удаляет обновления и все, что касается только этой проблемы.
У меня изначально была эта ошибка - "Не могу создать обработчик внутри потока, который не вызвал Looper.prepare()", который я исправил с помощью кода ниже, но теперь я получаю только одну ошибку Looper
Моя тема Looper выглядит следующим образом (пожалуйста, не будьте резкими, я очень новичок в Android LOL)
public void run() {
Looper.prepare();
setLooper(Looper.myLooper());
LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, locationListener);
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
stopLooper();
}
}, TWO_MINUTES);
Looper.loop();
t.cancel();
setLooper(null);
vb.getLm().removeUpdates(ll);
}
Как я уже сказал, я новичок, и я не уверен, как использовать обработчик. Я получил этот код из поста здесь, в Stackru, просто использовал его по-другому, но он не работает.
Пожалуйста, мне действительно нужна помощь. Спасибо за любые ответы.
Хорошо, похоже, я нашел решение, просто нужно проверить его, а затем подождать еще 7 часов, прежде чем я смогу опубликовать ответ. Спасибо за любые взгляды и ответы.
2 ответа
Не могу понять, что делает ваш код:) Почему бы не использовать что-то более простое, как это:
public void run( ) {
while (true) {
LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, locationListener);
sleep(2 * 60 * 1000);
LocationManager.removeUpdates();
sleep(5 * 60 * 1000);
}
}
Хорошо, может быть что-то подобное?
Runnable start = new Runnable( ) {
public void run( ) {
LocationManager.startLocationUpdates
handler.postDelayed(stop, 2 * 60 * 1000L);
}
}
Runnable stop = new Runnable( ) {
public void run( ) {
LocationManager.removeLocationUpdates
}
}
Runnable onePeriod = new Runnable( ) {
public void run( ) {
handler.postDelayed(onePeriod, 5 * 60 * 1000);
handler.post(start);
}
}
public void startContiniuosListening( ) {
handler.post(onePerion);
}
public void stopContiniousListening( ) {
handler.removeCallback(stop);
handler.removeCallback(onePeriod);
LocationManager.removeLocationUpdates(...)
}
где обработчик - поле класса:
Handler handler = new Handler();
Я нашел этот ответ на похожий вопрос очень полезным: /questions/42135408/horoshij-sposob-poluchit-mestopolozhenie-polzovatelya-v-android/42135416#42135416
По сути, вам просто нужно обернуть код вашего вопроса в отдельный поток...
new Thread(new Runnable() {
// Your code here...
}).start();
Затем этот рабочий поток создаст свой собственный Looper.