我正在使用cwac-locpoll,并且做得很好。但是,我的一些用户遇到以下问题

java.lang.RuntimeException: WakeLock under-locked com.commonsware.cwac.locpoll.LocationPoller
at android.os.PowerManager$WakeLock.release(PowerManager.java:339)
at android.os.PowerManager$WakeLock.release(PowerManager.java:299)
at com.commonsware.cwac.locpoll.WakefulThread.onPostExecute(WakefulThread.java:59)
at com.commonsware.cwac.locpoll.LocationPollerService$PollerThread.onPostExecute(LocationPollerService.java:231)
at com.commonsware.cwac.locpoll.WakefulThread.run(WakefulThread.java:93)


这是我的LocationReceiver类,如您所见,该类仅通过帮助程序类将获取的位置存储在我的应用程序SharedPreferences中。

public class LocationReceiver extends BroadcastReceiver {
    private static final String TAG = "LocationReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
    Bundle b = intent.getExtras();
        Location loc = (Location) b.get(LocationPoller.EXTRA_LOCATION);

        if (loc == null) {
            loc = (Location) b.get(LocationPoller.EXTRA_LASTKNOWN);

            if (loc == null) {
                Log.w(TAG, "Unable to get location. " + intent.getStringExtra(LocationPoller.EXTRA_ERROR));
            } else {
                Log.w(TAG, "Timeout getting location, using previous one " + loc);
            }
        } else {
            Log.i(TAG, "Got location " + loc);
        }

        // save location in preferences
        if (loc != null) {
            PrefsHelper.setLastLocation(loc.getLatitude(), loc.getLongitude());
        }
    }
}


我还使用了一个单独的cwac-wakeful WakefulIntentService来获取最后一个位置并执行某些操作,但是它们被设计为独立运行。换一种说法:


cwac-locpoll调用LocationReceiver来不时地将最后一个已知位置存储在SharedPreferences中。
WakefulIntentService被安排(独立地)获取此位置并对其进行处理。


谢谢!

最佳答案

这很可能与您的BroadcastReceiver无关。我需要将最近对WakefulIntentService的更改扩展到LocationPoller,以更好地处理边缘情况,例如Android放弃该服务并稍后再将其恢复,这可能会有所帮助。

我对此有一个问题–请跟踪该问题,以获取有关何时发布修订的注释。考虑到该组件的性质,我需要进行长时间运行的测试,因此可能至少需要24小时才能发布补丁。

关于android - 使用cwac-locpoll的WakeLock未锁定的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10449688/

10-12 02:40