2013-02-22 30 views
15

LocationListenerを持つandroid LocationManagerライブラリのルーチンrequestSingleUpdate()reoutineを使用しています。私が実装しようとしている機能は、ユーザーがボタンを押すことができ、アプリは現在の位置を取得し、逆ジオコーディングを実行しておおよそのアドレスを取得することです。android requestSingleUpdateのタイムアウトを設定する

私の問題は、デバイスのネットワーク状況によって、ロケーション修正を取得するのに時間がかかることです。私の 'requestSingleUpdate()'があきらめて自分の血まみれのアドレスを見つけるように指示するタイムアウトをどのように実装できますか?

私のコード:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_FINE); 
criteria.setPowerRequirement(Criteria.POWER_HIGH); 

locationManager.requestSingleUpdate(criteria, new LocationListener(){ 

     @Override 
     public void onLocationChanged(Location location) { 
      // reverse geo-code location 

     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onStatusChanged(String provider, int status, 
       Bundle extras) { 
      // TODO Auto-generated method stub 

     } 

    }, null); 

答えて

30

LocationManagerはタイムアウトメカニズムを持っていないようです。しかしLocationManagerにはremoveUpdates(LocationListener listener)というメソッドがあり、指定したLocationListenerのコールバックを取り消すことができます。

だから、あなたは、次の擬似コードのようなものを使用して独自のタイムアウトを実装することができます:

final LocationManager locationManager 
     = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    // ... 

    final LocationListener myListener = new LocationListener() { 
     //... your LocationListener's methods, as above 
    } 

    Looper myLooper = Looper.myLooper(); 
    locationManager.requestSingleUpdate(criteria, myListener, myLooper); 
    final Handler myHandler = new Handler(myLooper); 
    myHandler.postDelayed(new Runnable() { 
     public void run() { 
      locationManager.removeUpdates(myListener); 
     } 
    }, MY_TIMEOUT_IN_MS); 

私はあなたが場所を取得後locationManager.removeUpdates(myListener)を呼び出す場合、何が起こるか確かではありませんよ。 removeUpdatesに電話する前に確認してください。それとも、あなたは(そしておそらく他の方法と同様に)あなたのコールバックでonLocationChanged方法に、このような何かを追加することができます:あなたには、いくつかの理由でmyRunnableを参照することができない場合

myHandler.removeCallbacks(myRunnable); // where myRunnable == the above Runnable 
+3

を加えて、あなたははmyHandlerを使用することができます。 removeCallbacksAndMessages(null);代わりに –

関連する問題