Как запустить Android Worker, когда приложение убито?

В настоящее время я записываю видео на устройство, сжимаю это видео и затем загружаю сжатое видео на сервер, используя Retrofit 2, Я также использую Worker класс, чтобы выполнить все это в фоновом режиме. Прогресс также отображается в notification bar пока загрузка происходит. Моя проблема в том, что когда приложение убито, весь процесс загрузки останавливается. Я пытался вернуться WorkerResult.RETRY, который работает, но он просто повторяется, и поэтому один файл загружается несколько раз. Код указан ниже:

Рабочий класс

public class UploadWorker extends Worker implements ProgressRequestBody.UploadCallBacks {

private static final String LOG_TAG = UploadWorker.class.getSimpleName();
public static final int UPDATE_PROGRESS = 8344;
Context context;
WorkerParameters parameters;
private static final String SERVER_PATH = "";
String filePath;

/*For notification update*/
private NotificationCompat.Builder notificationBuilder;
private NotificationManager notificationManager;


public UploadWorker(Context context,
                    WorkerParameters parameters) {
    super(context, parameters);
    this.context = context;
    this.parameters = parameters;
}


@NonNull
@Override
public Result doWork() {

    showNotificationUpdate();

  compressVideo(getInputData().getString("currentPhotoPath");, 
  getInputData().getString("fileDestination"););

    constructFile(filePath);

    // Indicate success or failure with your return value:
    return Result.SUCCESS;


}

    private void uploadVideoToServer(File fileToUpload) {

    ProgressRequestBody fileBody = new ProgressRequestBody(fileToUpload, this);

    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    MultipartBody.Part vFile = MultipartBody.Part.createFormData("fileToUpload", fileToUpload.getName(), fileBody);

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(SERVER_PATH)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(provideClient())
            .build();

    VideoInterface vInterface = retrofit.create(VideoInterface.class);

    Call<ResponseBody> serverCom = vInterface.uploadVideo(vFile);

    serverCom.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

            try {
                if (response.body() != null) {
                    Log.d(LOG_TAG, "Resposne == " + response.body().string());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            Log.d(LOG_TAG, "Response In String == " + response);
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.d(LOG_TAG, "Error == " + t.getLocalizedMessage());
        }
    });

}

@Override
public void onProgressUpdate(int percentage) {
    updateNotification(percentage);
}

@Override
public void onError() {
    sendProgressUpdate(false);
}

@Override
public void onFinish() {
    sendProgressUpdate(true);

    notificationManager.cancel(0);
    notificationBuilder.setProgress(0, 0, false);
    notificationBuilder.setContentTitle("Upload Done");
notificationBuilder.setSmallIcon(android.R.drawable.stat_sys_upload_done);
    notificationManager.notify(0, notificationBuilder.build());
}
}

Вот так я настраиваю работника в своей деятельности

 Data inputData = new Data.Builder()
                    .putString("currentPhotoPath", mCurrentPhotoPath)
                    .putString("fileDestination", f.getPath())
                    .build();

            Constraints constraints = new Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.CONNECTED)
                    .setRequiresStorageNotLow(true)
                    .build();

            OneTimeWorkRequest compressionWork =
                    new OneTimeWorkRequest.Builder(UploadWorker.class)
                            .setConstraints(constraints)
                            .addTag("CompressVideo")
                            .setInputData(inputData)
                            .build();

            WorkManager.getInstance()
                    .enqueue(compressionWork);

            WorkManager.getInstance().getStatusById(compressionWork.getId())
                    .observe(this, new Observer<WorkStatus>() {
                        @Override
                        public void onChanged(@Nullable WorkStatus workStatus) {

                            Log.d(LOG_TAG, "WORKER STATE == " + workStatus.getState().name());

                            if (workStatus != null && workStatus.getState().isFinished()) {
                                Log.d(LOG_TAG, "Is WOrk Finished == " + workStatus.getState().isFinished());
                            }

                        }
                    });

Может кто-нибудь помочь мне в поиске подходящего решения, чтобы при закрытии приложения загрузка файла все еще продолжалась и прекращалась после его завершения?

0 ответов

Другие вопросы по тегам