20

我正在使用带有LocationListener的 android LocationManager库的例程 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);
4

1 回答 1

36

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(也可能添加到其他方法中):

    myHandler.removeCallbacks(myRunnable); // where myRunnable == the above Runnable 
于 2013-04-08T23:02:37.400 回答