1

向きの変更を乗り切るために、以下のライブラリを実装しようとしています: 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;
    }
}

カウント用の Controller の例を次に示します。

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);
}

デバイスを回転させると、同じジョブが再び開始されます。したがって、私が間違っていなければ、ネットワーク呼び出しを行っている場合、向きが変わるとリクエストが複製されます。

私の実装に問題があると思います。ライブラリページの例として実装しようとしました。助言がありますか?ありがとう。

4

2 に答える 2

2

ローテーション時にジョブを再作成していると思いますので、最終的には 2 つのジョブになります。アクティビティが構成を変更するとき (別名ローテーション)、2 回キューに入れるべきではありません。

于 2016-11-08T07:07:50.463 に答える
0

私は解決策を見つけました: グループ ID を与えてからジョブに ID を与えると、ジョブが再び実行されなくなります。これがjavadocです:

/////// グループ用 ///////

/** * グループ ID を設定します。同じグループ内のジョブは、順次実行されることが保証されています。* @param このジョブが属するグループ (もちろん null でも構いません) * @return this */

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

////////IDについて////////

/** * 単一のインスタンス ID を設定します。同じ単一 ID を持つ別のジョブがキューに * あり、まだ実行されていない場合、このジョブは * {@link Job#onCancel(int, Throwable)} を * {@link Job#onAdded()} の直後に呼び出し、前のジョブのみを取得します。ジョブが実行されます。つまり、{@link Job#onRun()} * は 1 回だけ呼び出されます。*

グループ ID が設定されていない場合は、自動的に設定されます。* @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));
    }
于 2017-09-05T13:43:06.060 に答える