web-dev-qa-db-ja.com

Android requestSingleUpdateのタイムアウトを設定します

Android LocationManager ライブラリと LocationListener のルーチン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);
20
AnjoMan

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)afterを呼び出した場合、場所を取得するとどうなるかわかりません。 removeUpdatesを呼び出す前に、それを確認することをお勧めします。または、コールバックのonLocationChangedメソッドに(場合によっては他のメソッドにも)次のようなものを追加できます。

_    myHandler.removeCallbacks(myRunnable); // where myRunnable == the above Runnable 
_
34
Dan Breslau