Android TimerTask для замораживания местоположения GPS - PullRequest
0 голосов
/ 16 января 2012

Я борюсь с этим Looper в Android. У меня есть таймер, который работает каждую минуту. Это отправляет сообщение на сервер с указанием местоположения пользователя.

private Looper looper;    
public boolean getLocation(Context context, LocationResult result) {
        locationResult = result;
        lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        //exceptions will be thrown if provider is not permitted.
        try {
            gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }

        // don't start listeners if no provider is enabled
        if (!gps_enabled)
            return false;

        if(Looper.myLooper() == null)
            Looper.myLooper().prepare();

        looper = Looper.myLooper();
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);

        looper.loop();
        return true;
    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
            looper.quit();
            lm.removeUpdates(this);

            locationResult.gotLocation(location); // broadcast location
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    };

При первом срабатывании таймера все работает отлично. Во второй раз таймер зависает и значок GPS на телефоне говорит, что он заблокирован, но не исчезает. Это как если бы Looper не зацикливался на обработке сообщений во второй раз, хотя я говорю это зацикливать. Если я вызываю Looper.prepare () каждый раз, во второй раз, когда запускается таймер, я получаю исключение, говорящее только об одном Looper на поток.

Конечно, это не должно быть так сложно!

1 Ответ

0 голосов
/ 17 января 2012

Не лучшим образом, но когда таймер тикает, он создает новый поток, в котором можно получить текущее местоположение, а затем отправить эту информацию на сервер.Таким образом, каждый поток получает свой собственный Looper, который решает мою проблему.Как я уже сказал, не самый лучший, но у таймера есть и другая работа.

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