2012-01-16 3 views
0

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

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 в потоке.

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

ответ

0

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

Смежные вопросы