2012-01-16 15 views
0

私はAndroidのこのルーパーに苦労しています。私は毎分実行されるタイマーを持っています。これにより、ユーザーの所在地とともにサーバーにメッセージが送信されます。Android TimerTaskでGPSの場所がフリーズする

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) { 
     } 
    }; 

初めてタイマーが起動すると、すべて正常に動作します。 2回目は、タイマーがフリーズし、携帯電話のGPSアイコンにロックが設定されていると表示されますが、離れません。ルーパーが2回目にメッセージを処理するためにループしていないかのようです。毎回Looper.prepare()を呼び出すと、2回目にタイマーが実行されますが、スレッドごとに1つのLooperしか例外が発生しません。

確かにこれはあまり難しくありません!

答えて

0

最善の方法ではありませんが、タイマーが刻々と変化すると、現在の場所を取得してその情報をサーバーに送信する新しいスレッドが作成されます。このようにして、各スレッドは私の問題を解決する独自のLooperを取得します。私が言ったように、最高ではありませんが、タイマーは他の仕事があります。