I use Workmanager and Retrofit to send requests to the server.
I send the data to insert into the database on the server.
When the result of the request is fail, WorkManager will resend the request until the result of the request is success(Data is Inserted into the database).
As long as the app still running there is no problem, but when the app closes, the WorkManager still works fine and I get success request, but the data isn't inserted into the database on the server.
Note : I tested on emulator and real phone but the result is same.
Activity :
Type listOfClassObject = new TypeToken<ClassEntry>(){}.getType();
Gson gson = new Gson();
String s = gson.toJson(classEntry, listOfClassObject);
Data.Builder myData = new Data.Builder();
myData.putString("classEntry_data", s);
myData.putString(EXTRA_URL, INSERT_CLASS);
//set network required
Constraints myConstraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest attendWork = new PeriodicWorkRequest.Builder(ClassWorker.class, 15, TimeUnit.MINUTES)
.setConstraints(myConstraints)
.setInputData(myData.build())
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork("testTag",
ExistingPeriodicWorkPolicy.KEEP, attendWork);
ClassWorker :
public class ClassWorker extends Worker {
private WorkerParameters workerParams;
public ClassWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
this.workerParams = workerParams;
}
@NonNull
@Override
public Result doWork() {
Data data = getInputData();
Gson gson = new Gson();
String s = data.getString("classEntry_data");
ClassEntry classEntry = gson.fromJson(s, ClassEntry.class);
MyWebService webService = MyWebService.retrofit.create(MyWebService.class);
Call<ClassEntry> call = webService.sendClass(
data.getString(EXTRA_URL),
classEntry.getClassId(),
PREFERENCES_USER_ID,
classEntry.getClassName(),
classEntry.getClassDay(),
classEntry.getStartTime(),
classEntry.getEndTime(),
classEntry.getClassNumber(),
classEntry.getUniversityName());
Response<ClassEntry> response = null;
try {
response = call.execute();
if (response != null && !response.isSuccessful() && response.errorBody() != null){
Log.e(ClassService.class.getSimpleName(), "WorkManagerLog.response error : " + response.errorBody());
return Result.failure();
}
if (response.isSuccessful()){
Log.e(ClassService.class.getSimpleName(), "WorkManagerLog.response: success");
WorkManager.getInstance().cancelWorkById(workerParams.getId());
return Result.success();
}
} catch (IOException e) {
e.printStackTrace();
Log.e(ClassService.class.getSimpleName(), "WorkManagerLog.onHandleIntent: " + e.getMessage());
return Result.failure();
}
return Result.failure();
}
}