Что я делаю:
- Мне нужно загрузить файл размером 100 МБ из фона
- Я использую менеджер работ с модернизацией, чтобы добиться этого
- Я запускаю модернизацию из диспетчера работ
- Это однократная загрузка (после загрузки файла. Мне не нужна служба, работающая в фоновом режиме для повторной загрузки)
Что Происходит:
- Если я держу приложение на переднем плане, я успешно могу загрузить файл
- Но, скажем, однажды после запуска рабочего потока я закрываю приложение. Я заметил, что файл не загружается в фоновом режиме.
Вопрос : Как убедиться, что все файлы размером 100 МБ загружаются в фоновом режиме до завершения
В действии я запускаю:
final WorkManager mWorkManager = WorkManager.getInstance(context);
final OneTimeWorkRequest mRequest = new OneTimeWorkRequest.Builder(DictionaryWorker.class)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.setRequiresStorageNotLow(true)
.build())
.addTag(DICTIONARY_WORKER_TAG)
.build();
mWorkManager.enqueue(mRequest);
В рабочем классе:
public class DictionaryWorker extends Worker {
private final String CURRENT_SCREEN = DictionaryWorker.this.getClass().getSimpleName();
private static final String WORK_RESULT = "work_result";
private Context context;
private NetworkComponent networkComponent;
public DictionaryWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
this.context = context;
}
@NonNull
@Override
public Result doWork() {
initCnxNetworkConnection(context);
Data outputData = new Data.Builder().putString(WORK_RESULT, "Jobs Finished").build();
return Result.failure(outputData);
}
private RandomUsersApi getNetworkService(Context context) {
if(networkComponent==null){
networkComponent = DaggerNetworkComponent.builder()
.contextModule(new ContextModule(context))
.networkModule(new NetworkModule())
.okHttpClientModule(new OkHttpClientModule())
.build();
}
return networkComponent.getService();
}
/********************************************************** RETROFIT *************************************************/
private void initCnxNetworkConnection(final Context context) {
try{
Call<ResponseBody> call = getNetworkService(context).downloadDictionary();
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//File is downloaded here and written to storage
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Timber.e(CURRENT_SCREEN, "error");
}
});
}catch (Exception ex){
incompleteDownload();
Timber.e(CURRENT_SCREEN, "error%s", ex);
}
}
/********************************************************** RETROFIT *************************************************/
}
Я просто пытаюсь по сценарию ниже
Guaranteed execution:– The WorkManager will make sure to start the execution of background tasks under different conditions, even if we come out of the app.