Android-Priority-Jobqueue выживает изменение ориентации

Я пытаюсь реализовать библиотеку ниже, чтобы пережить изменения ориентации: https://github.com/yigit/android-priority-jobqueue

Вот моя конфигурация:

 Configuration config = new Configuration.Builder(getApplication())
                .consumerKeepAlive(45)
                .maxConsumerCount(3)
                .minConsumerCount(1)
                .build();
        return new JobManager(config);

Вот мой пример работы:

public class CounterJob extends Job {
    private int countTo;

    protected CounterJob(int countTo, Params params) {
        super(params);
        this.countTo = countTo;
    }

    @Override
    public void onAdded() {
        Log.e("counting to", "" + countTo);
    }

    @Override
    public void onRun() throws Throwable {
        Log.e("running job", "" + countTo);
        int total = 0;
        for (int i = 0; i < countTo; i++) {
            total += i;
        }

        Log.e("total", "" + total);
    }

    @Override
    protected void onCancel(int cancelReason, @Nullable Throwable throwable) {

    }

    @Override
    protected RetryConstraint shouldReRunOnThrowable(@NonNull Throwable throwable, int runCount, int maxRunCount) {
        return null;
    }
}

Вот пример контроллера для подсчета:

public class CounterController {
    private JobManager mJobManager;

    public CounterController(JobManager jobManager) {
        this.mJobManager = jobManager;
    }

    public void count(int countTo) {
        mJobManager.addJobInBackground(new CounterJob(countTo, new Params(1).requireNetwork().persist()));
    }
}

И я называю как:

@Override
protected void onResume() {
    super.onResume();
    mCounterController.count(1000000000);
}

Когда я поворачиваю устройство, та же самая работа начинается снова. Так что, если я не ошибаюсь, если я делаю сетевой вызов, при изменении ориентации он дублирует запрос.

Я думаю, что есть проблема в моей реализации. Я попытался реализовать в качестве примера на странице библиотеки. Какие-либо предложения? Благодарю.

2 ответа

Решение

Я предполагаю, что вы воссоздаете задание, когда вращаетесь, так что в итоге вы получаете 2 задания. Вы не должны ставить его в очередь дважды, когда активность меняет конфигурацию (то есть вращение).

Я нашел решение: вы можете дать идентификатор группы, а затем идентификатор для задания, чтобы оно больше не запускалось. Вот этот Javadoc:

/////// для группы ///////

/ ** * Устанавливает идентификатор группы. Задания в той же группе гарантированно выполняются последовательно. * @param groupId, к какой группе относится это задание (может быть, конечно, нулевым) * @return this */

public Params groupBy(String groupId) {
    this.groupId = groupId;
    return this;
}

//////// для удостоверения личности ////////

/ ** * Устанавливает идентификатор одного экземпляра. Если есть другое задание с таким же одиночным идентификатором, поставленное в очередь и * еще не запущенное, это задание будет вызываться {@link Job#onCancel(int, Throwable)}, вызываемое сразу после * {@link Job#onAdded()}, и только после предыдущего Работа будет работать. То есть {@link Job#onRun()} * будет вызываться только один раз. *

Если идентификатор группы не был установлен, он будет установлен автоматически. * @param singleId, к какой группе экземпляров принадлежит эта работа (может быть, конечно, null) * @ return this * /

public Params singleInstanceBy(String singleId) {
    this.singleId = singleId;
    return this;
}

Вы устанавливаете это в методах конструктора

  public Step1Jobs() {
        super(new Params(Priority.LOW).requireNetwork().groupBy(STEPS).singleInstanceBy(STEP1));
    }
Другие вопросы по тегам