Android 从前台删除应用程序时使用work manager下载数据

Android 从前台删除应用程序时使用work manager下载数据,android,android-workmanager,Android,Android Workmanager,我在做什么: 我需要从后台下载一个100MB的文件 我正在使用work manager进行改装以实现这一点 我正在从工作经理处启动改装 这是一次下载(一旦我下载了文件。我不需要在后台运行的服务再次下载) 正在发生的事情: 如果我把应用程序放在前台,我就能成功地 下载该文件 但在启动worker线程后,我会关闭应用程序。我 请注意,文件不能在后台下载 问题:如何确保所有100 mb文件在后台下载完成 在我正在发起的活动中: final WorkManager mWorkManager

我在做什么:

  • 我需要从后台下载一个100MB的文件
  • 我正在使用work manager进行改装以实现这一点
  • 我正在从工作经理处启动改装
  • 这是一次下载(一旦我下载了文件。我不需要在后台运行的服务再次下载)
正在发生的事情:

  • 如果我把应用程序放在前台,我就能成功地 下载该文件
  • 但在启动worker线程后,我会关闭应用程序。我 请注意,文件不能在后台下载
问题:如何确保所有100 mb文件在后台下载完成


在我正在发起的活动中:

 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 *************************************************/


}
工人阶级:

 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 *************************************************/


}