我正在使用工作管理器来启动位置服务,它在每个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;
//...
}
答案 0 :(得分:2)
此代码有一些错误之处:
从总体上讲,您正在使用一个同步的Worker来执行异步(基于回调)的代码。这行不通。请阅读https://developer.android.com/topic/libraries/architecture/workmanager/advanced/threading(尤其要注意ListenableWorker,这是您要使用的类)。
您正在从@NonNull方法返回null。 WorkManager将立即将此工作视为失败。返回正确的值。
您的位置间隔设置为一个小时。工人们最多可以执行10分钟,因此这也不起作用。 FWIW,我真的怀疑这段代码是否与JobScheduler一起正常工作;它也有一个10分钟的执行窗口。