【问题标题】:Android Location Listener call very oftenAndroid Location Listener 经常调用
【发布时间】:2012-10-26 20:01:04
【问题描述】:

我正在使用网络位置提供程序。 我需要每 1 小时从我的 LocationListener 调用一次 onLocationChanged 方法。 这是我的代码:

MyLocationListener locationListener = new MyLocationListener();   
locationMangaer.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3600000, 0,locationListener);

但它不起作用。我的onLocationChanged 经常打电话。

我必须使用哪些参数?

【问题讨论】:

    标签: android locationlistener


    【解决方案1】:

    来自LocationManager#requestLocationUpdates() 文档:

    在 Jellybean 之前,minTime 参数只是一个提示,一些位置提供程序实现忽略了它。从 Jellybean 开始,Android 兼容设备必须遵守 minTime 和 minDistance 参数。

    但是,您可以将 requestSingleUpdate() 与 Looper 和 Handler 一起使用,每小时运行一次更新。


    加法
    首先,您可以阅读有关Loopers and Handlers here 的更多信息。

    您正在使用 API 8,这是一个不错的选择,但这限制了我们可以调用的 LocationManager 方法,因为大多数方法是在 API 9 中引入的。API 8 只有这三个方法:

    requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
    requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper)
    requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)
    

    让我们使用第一种方法,它是最简单的。

    首先,像往常一样创建您的 LocationManager 和 LocationListener,但在onLocationChanged() 停止请求更多更新:

    @Override
    public void onLocationChanged(Location location) {
        mLocationManager.removeUpdates(mLocationListener);
        // Use this one location however you please
    }
    

    其次,创建几个新的类变量:

    private Handler mHandler = new Handler();
    private Runnable onRequestLocation = new Runnable() {
        @Override
        public void run() {
            // Ask for a location
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
            // Run this again in an hour
            mHandler.postDelayed(onRequestLocation, DateUtils.HOUR_IN_MILLIS);
        }
    };
    

    当然,您应该在onPause() 中禁用所有回调并在onResume() 中再次启用它们,以防止LocationManager 通过在后台获取未使用的更新而浪费资源。


    更技术性的观点:
    如果您担心使用 LocationManager 阻塞 UI 线程,那么您可以使用第二个 requestLocationUpdates() 方法从新线程(例如 HandlerThread)提供特定的 Looper。

    【讨论】:

    • 谢谢...也许你可以给我一些 Looper 和 Handler 例子的链接?
    • 首先,您使用的最低 API 是多少? (8、10、16?)
    • 为了以后读者的完整性,在 Sam 的最后一个技术点“关注用 LocationManager 阻塞 UI 线程”中,他的意思是关联的 LocationListener 的回调(如 onLocationChanged())。请注意,LocationManager.requestLocationUpdates() 方法没有阻塞,调用它并不足以涉及 Loopers 和 Handlers。
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 2023-03-21
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多