LocationManager и Looper - для одного потока может быть создан только один Looper - PullRequest
2 голосов
/ 09 декабря 2011

У меня проблема с моим приложением. Мне нужно получать обновления местоположения через определенные промежутки времени и, следовательно, в основном нужно уметь хорошо управлять модулем GPS, с ОС Android это не совсем легко. В основном мне нужно включить GPS на 2 минуты с интервалом в 5 минут. У меня нет времени, и я могу получить местоположение дважды, но затем приложение вылетает с ошибкой RunTime - только один Looper может быть создан для потока. Синхронизация выполняется в классе обслуживания и работает хорошо, он удаляет обновления и все, что касается только этой проблемы.

У меня изначально была эта ошибка - «Не удалось создать обработчик внутри потока, который не вызвал Looper.prepare ()», который я исправил с помощью приведенного ниже кода, но теперь я получаю только одну ошибку 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);

    }

Как я уже сказал, я новичок, и я не уверен, как использовать обработчик. Я получил этот код из поста здесь, в StackOverflow, просто использовал его по-другому, но он не работает.

Пожалуйста, мне действительно нужна помощь. Спасибо за любые ответы.

Хорошо, похоже, я нашел решение, просто нужно проверить его, а затем подождать еще 7 часов, прежде чем я смогу опубликовать ответ. Спасибо за любые взгляды и ответы.

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Не могу понять, что делает ваш код :) Почему бы не использовать что-то более простое, как это:

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();
0 голосов
/ 10 декабря 2012

Я нашел этот ответ на похожий вопрос очень полезным: https://stackoverflow.com/a/6576972/588556

По сути, вам просто нужно обернуть код вашего вопроса в отдельную ветку ...

new Thread(new Runnable() {
    // Your code here...
}).start();

Тогда этот рабочий поток создаст свой собственный Looper.

...