Android-Priority-Jobqueue Surviving Orientation Change

时间:2016-11-07 09:59:00

标签: android 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 个答案:

答案 0 :(得分:2)

我猜你在旋转时正在重新创建工作,那么你最终会得到2个工作。当活动改变配置(a.k.a. rotation)时,你不应该将它排队两次。

答案 1 :(得分:0)

我找到了解决方案:您可以为作业提供一个组ID,然后提供一个ID,这样它就不会再次运行了。这是javadoc:

///////为小组///////

  

/ **        *设置组ID。保证同一组中的作业按顺序执行。        * @param groupId此作业所属的组(当然可以为null)        * @return this        * /

/usr/local/lib
////////为ID ////////

  

/ **        *设置单个实例ID。如果有另一个具有相同单个ID的作业排队并且        *尚未运行,此作业将立即调用{@link Job#onCancel(int,Throwable)}        * {@link Job#onAdded()},只会运行上一个Job。也就是说,{@ link Job#onRun()}        *只会被召唤一次。        *

如果未设置组ID,将自动设置一个。        * @param singleId此作业所属的单个实例组(当然可以为null)        * @return this        * /

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

您可以在构造函数方法

中设置它
public Params singleInstanceBy(String singleId) {
    this.singleId = singleId;
    return this;
}