Workmanager не отправляет координаты на мой сервер, когда телефон находится в спящем режиме. Асинтаск убит?
Я использую Workmanager (PeriodicWorkRequest) для получения координат каждые 15 минут. Чтобы получить координаты, я использую FusedLocationClient. Это отлично работает... но я также хочу отправить их на свой сервер.
Если я начну отправлять «public void onComplete» (см. код), мне придется использовать AsyncTask (другое решение??). Это работает, когда мой телефон не находится в спящем режиме. Цель состоит в том, чтобы отправка продолжалась. Как я могу это решить (новичок, примеры меня радуют :))
MainActivity Start Workmanager
public static void scheduleWork(String tag) {
PeriodicWorkRequest.Builder SendLocation =
new PeriodicWorkRequest.Builder(LocationWorker.class, 15,
TimeUnit.MINUTES);
PeriodicWorkRequest locationCheckWork = SendLocation.build();
WorkManager instance = WorkManager.getInstance();
instance.enqueueUniquePeriodicWork(tag, ExistingPeriodicWorkPolicy.KEEP , locationCheckWork);
}
Локационворкер
@NonNull
@Override
public Result doWork() {
Log.d(TAG, "onStartJob: STARTING JOB..");
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(mContext);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
}
};
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
try {
mFusedLocationClient
.getLastLocation()
.addOnCompleteListener(new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
if (task.isSuccessful() && task.getResult() != null) {
mLocation = task.getResult();
Log.d(TAG, "Location : " + mLocation);
double latitude = mLocation.getLatitude();
double longitude = mLocation.getLongitude();
// SEND TO SERVER
AsyncTask.execute(new Runnable()
{
@Override
public void run() {
HttpURLConnection connection;
try {
//Open a new URL connection
connection = (HttpURLConnection) new URL(myurl)
.openConnection();
//Defines a HTTP request type
connection.setRequestMethod("POST");
//Sets headers: Content-Type, Authorization
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("Authorization", "Token fab11c9b6bd4215a989c5bf57eb678");
String userid= Prefs.getUserid(getApplicationContext());
String compid= Prefs.getCompid(getApplicationContext());
//Add POST data in JSON format
JSONObject jsonParam = new JSONObject();
try {
jsonParam.put("latitude", latitude);
jsonParam.put("longitude", longitude);
jsonParam.put("userid", userid);
jsonParam.put("compid", compid);
} catch (JSONException e) {
e.printStackTrace();
}
//Create a writer object and make the request
OutputStreamWriter outputStream = new OutputStreamWriter(connection.getOutputStream());
outputStream.write(jsonParam.toString());
outputStream.flush();
outputStream.close();
//Get the Response code for the request
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String responseBody = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
responseBody = br.lines().collect(Collectors.joining());
}
Log.i(TAG, "responseBody: "+responseBody);
//return connection.getResponseCode();
} catch (IOException e) {
e.printStackTrace();
}
}
});
mFusedLocationClient.removeLocationUpdates(mLocationCallback);
} else {
Log.w(TAG, "Failed to get location.");
}
}
});
} catch (SecurityException unlikely) {
Log.e(TAG, "Lost location permission." + unlikely);
}
try {
mFusedLocationClient.requestLocationUpdates(mLocationRequest, null);
} catch (SecurityException unlikely) {
//Utils.setRequestingLocationUpdates(this, false);
Log.e(TAG, "Lost location permission. Could not request updates. " + unlikely);
}
return Result.SUCCESS;
}