【问题标题】:Android-Priority-Jobqueue Surviving Orientation ChangeAndroid-Priority-Jobqueue 幸存的方向变化
【发布时间】:2017-03-20 15:06:23
【问题描述】:

我正在尝试实现以下库以适应方向变化: 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);
}

当我旋转设备时,同样的工作又开始了。所以,如果我没记错的话,如果我在进行网络调用,当方向改变时,它会复制请求。

我认为我的实施存在问题。我试图在库页面中作为示例实现。有什么建议?谢谢。

【问题讨论】:

    标签: android android-priority-jobqueue


    【解决方案1】:

    我猜你在轮换时正在重新创建工作,所以你最终会得到 2 个工作。当活动更改配置(也称为轮换)时,您不应将其排入队列两次。

    【讨论】:

    • 我可以手动检查它,但我的意思是,我想知道图书馆是否有能力忽略在一段时间内创建的相同作业或加入第一个创建的作业。
    • 图书馆不知道方向变化,但它有办法避免重复作业。 yigit.github.io/android-priority-jobqueue/javadoc/com/birbit/… 请注意,这仅在前一个在队列中时才有效。
    • 因此,如果原始作业仍在运行,则作业将被复制。
    • 注意:这个库现在已被弃用,请改用 WorkManager(用于持久作业)。对于非持久性工作,请使用此处推荐的 Coouties github.com/yigit/android-priority-jobqueue
    【解决方案2】:

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

    /////// 组 ///////

    /** * 设置组 ID。保证同一组中的作业按顺序执行。 * @param groupId 这个工作属于哪个组(当然可以为空) * @return 这个 */

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

    ////////对于ID ////////

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

    如果没有设置组 ID,则会自动设置一个。 * @param singleId 该作业属于哪个单实例组(当然可以为空) * @return 这个 */

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

    在构造方法中设置

      public Step1Jobs() {
            super(new Params(Priority.LOW).requireNetwork().groupBy(STEPS).singleInstanceBy(STEP1));
        }
    

    【讨论】:

    • 如果我没有错,如果作业当前正在执行,在我的情况下检查 id 将不起作用,正如文档所说:如果有另一个具有相同单个 id 的作业排队并且 * 尚未运行.
    • 你可以尝试让我知道 ^^ 另一种解决方案是使用像 Icepick 这样的库并保持布尔值的状态,如果这个布尔值是真的,那么你启动你的工作然后把它放上去错误(对不起我的英语)
    • 我认为没有必要因为yigit的回答而尝试。我们需要创建一个处理旋转的机制。
    猜你喜欢
    • 1970-01-01
    • 2016-03-26
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多