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);
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
_