Установите тайм-аут для Android requestSingleUpdate
Я использую рутинную reoutine requestSingleUpdate () для android LocationManager библиотека LocationListener. Функциональность, которую я пытаюсь реализовать, заключается в том, что пользователь может нажать кнопку, и приложение получит свое текущее местоположение и выполнит обратное геокодирование, чтобы получить приблизительный адрес.
моя проблема заключается в том, что в зависимости от положения устройства, определить местоположения может занять длительное время. Как я могу реализовать тайм-аут, который заставит мой "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);
1 ответов
LocationManager
, похоже, не имеет механизма тайм-аута. Но!--2--> есть метод с именем 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
метод в вашем обратном вызове (и, возможно, к другим методам):
myHandler.removeCallbacks(myRunnable); // where myRunnable == the above Runnable