无法从WorkManager调用位置

时间:2019-04-22 13:26:36

标签: android android-intent android-location android-jobscheduler android-workmanager

我正在使用工作管理器来启动位置服务,它在每个doWork()之后加载15 minutes方法,但是不执行onLocationChanged

在我使用Job Scheduler之前,它工作得很好。

如果我在15分钟后显示来自工作管理器的通知,以下代码也可以正常工作。

这是我的代码。

   public class LocationWorker extends Worker implements LocationListener, GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener{


        private static final long BACKGROUND_INTERVAL = 1000 * 60 * 60;
        final private String TAG = LocationUpdateService.class.getSimpleName();
        LocationRequest mLocationRequest;
        GoogleApiClient mGoogleApiClient;



 @NonNull
    @Override
    public Result doWork() {


        if (isGooglePlayServicesAvailable()) {
            mGoogleApiClient = new GoogleApiClient.Builder(GlobalApplication.getAppContext())
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();

            mGoogleApiClient.connect();
            jwtToken = getJWTToken();
        }


        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(BACKGROUND_INTERVAL);
        mLocationRequest.setFastestInterval(BACKGROUND_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        return null;
    }



@Override
    public void onLocationChanged(Location location) {


        String storedLat, storedLng;
        //...

}

1 个答案:

答案 0 :(得分:2)

此代码有一些错误之处:

  1. 从总体上讲,您正在使用一个同步的Worker来执行异步(基于回调)的代码。这行不通。请阅读https://developer.android.com/topic/libraries/architecture/workmanager/advanced/threading(尤其要注意ListenableWorker,这是您要使用的类)。

  2. 您正在从@NonNull方法返回null。 WorkManager将立即将此工作视为失败。返回正确的值。

  3. 您的位置间隔设置为一个小时。工人们最多可以执行10分钟,因此这也不起作用。 FWIW,我真的怀疑这段代码是否与JobScheduler一起正常工作;它也有一个10分钟的执行窗口。