Как запустить 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());
                            }

                        }
                    });

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

вы пробовали УСПЕХ?

Zafer Celaloglu 12.10.2018 13:36

@ZaferCelaloglu Да. Но загрузка останавливается, когда приложение убивается (очищается от последних).

Rajeev 12.10.2018 13:37

тогда вам нужно сохранить статус загрузки (логическое значение) каждого видео, если оно было загружено раньше, ничего не делайте

Zafer Celaloglu 12.10.2018 13:40

Мне нужно будет поддерживать флаг в ответ на модернизацию, а затем работать с этим, верно?

Rajeev 12.10.2018 13:42
1
4
468
0

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