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.

Другие вопросы по тегам