等待定期任务中的异步回调



我想每 4 小时左右检查一次用户的位置,我不想让我的应用程序运行一次。看起来将GcmTaskService与PeriodicTask一起使用将允许调用我的服务(WakefulBroadcastReceiver在Android 6+中停止应用程序时对启动任务有限制),并且它将兼容Android 4.4(与JobScheduler不同) - 我支持的最低Android版本。

问题是 GcmTaskService 的 onRunTask 方法是同步的,但我想使用它来请求位置并处理结果(LocationManager 将异步调用我的 LocationListener 实现)。

应该如何处理?

使用简单的等待/通知:

private interface RunnableLocationListener extends Runnable, LocationListener {}
@Override
public int onRunTask (TaskParams params) {
    final Object monitor = new Object();
    final AtomicBoolean located = new AtomicBoolean();
    new Thread(new RunnableLocationListener() {
        Context context = PeriodicCollector.this;
        public void run() {
            Criteria criteria = new Criteria();
            criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);
            LocationManager locationManager = locationManager = (LocationManager)PeriodicCollector.this.getSystemService(Context.LOCATION_SERVICE);
            locationManager.requestSingleUpdate(criteria, this, Looper.getMainLooper());
        }
        @Override
        public void onLocationChanged(Location location) {
            // handle location here
            synchronized (monitor) {
                located.set(true);
                monitor.notifyAll();
            }
        }
        @Override public void onProviderDisabled(String s) {}
        @Override public void onProviderEnabled(String s) {}
        @Override public void onStatusChanged(String s, int i, Bundle b) {}
    }).start();
    int status = GcmNetworkManager.RESULT_FAILURE;
    try {
        synchronized (monitor) {
            if (!located.get()) {
                monitor.wait();
            }
        }
    } catch (InterruptedException e) {
        status = GcmNetworkManager.RESULT_SUCCESS;
    }
    return status;
}

相关内容

  • 没有找到相关文章

最新更新