Использование диспетчера работ для загрузки данных при удалении приложения с переднего плана - PullRequest
0 голосов
/ 09 апреля 2020

Что я делаю:

  • Мне нужно загрузить файл размером 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.
...