[关闭]
@zongwu 2017-01-05T06:15:34.000000Z 字数 5665 阅读 401

JobQueue

技术交流


简述

优先级作业队列是专门为Android编写的作业队列的实现,可轻松安排在后台运行的作业(任务),提高用户体验和应用程序稳定性。

它主要是考虑到灵活性和功能。这是一个正在进行的项目,我们将继续增加稳定性和性能改进。

项目地址:android-priority-jobqueue


为什么有这个项目?

遇到的问题

几乎每个应用程序都在后台线程中工作。期望这些“后台任务”能够保持应用程序响应和鲁棒性,特别是在不利的情况下(例如遭限制的网络连接)。在Android应用程序中,有几种方法来实现后台工作:

我们的解决办法

作业队列为您提供了一个良好的框架来做所有上述和更多。您将后台任务定义为作业,并将其排入到JobManager作业管理器将负责优先级,持久性,负载平衡,延迟,网络控制,分组等。它还为您的工作提供了良好的生命周期,以提供更好,一致的用户体验。

虽然不是必需的,但在与Event Bus一起使用时最有用。它还支持依赖注入

作业队列的灵感来自关于REST客户端应用程序的Google I / O 2010演讲

如何编写代码

定义JOB

  1. // 一个发送推文的作业
  2. public class PostTweetJob extends Job {
  3. public static final int PRIORITY = 1;
  4. private String text;
  5. public PostTweetJob(String text) {
  6. // 此作业需要网络连接
  7. // 并且应该在应用程序在作业完成之前退出的情况下持久保存。
  8. super(new Params(PRIORITY).requireNetwork().persist());
  9. }
  10. @Override
  11. public void onAdded() {
  12. // 作业已保存到磁盘。
  13. // 这是一个调度UI事件以指示作业最终将运行的好地方。
  14. // 在这个例子中,最好用新发布的tweet更新UI。
  15. }
  16. @Override
  17. public void onRun() throws Throwable {
  18. // 作业逻辑在这里。在这个例子中,在这里完成到Twitter的网络调用。
  19. // 这里做的所有工作应该是同步的, 当方法执行完毕后Job会从队列中移除。
  20. webservice.postTweet(text);
  21. }
  22. @Override
  23. protected RetryConstraint shouldReRunOnThrowable(Throwable throwable, int runCount,
  24. int maxRunCount) {
  25. // onRun中发生错误。
  26. // 返回值确定此作业是否应重试或取消。
  27. // 您可以进一步指定回退策略或更改作业的优先级。 您还可以将延迟应用于整个组,以保留作业的运行顺序。
  28. return RetryConstraint.createExponentialBackoff(runCount, 1000);
  29. }
  30. @Override
  31. protected void onCancel(@CancelReason int cancelReason, @Nullable Throwable throwable) {
  32. // 作业已超过重试尝试次数,或者shouldReRunOnThrowable()已决定取消。
  33. }
  34. }

触发JOB

  1. public void onSendClick() {
  2. final String status = editText.getText().toString();
  3. if(status.trim().length() > 0) {
  4. jobManager.addJobInBackground(new PostTweetJob(status));
  5. editText.setText("");
  6. }
  7. }

就这么简单,JobManager提供如下优点:

Priority Job Queue vs Job Scheduler vs GCMNetworkManager vs ?

在Lollipop版本,Android引入了JobScheduler,这是一种系统友好的方式来运行non-time-critical任务。它使你的代码更清洁,使你的应用程序是一个良好的公民的生态系统,它是通过GCMNetworkManager backported。

第一个作业队列版本是在Job Scheduler之前大约2年创建的。主要区别是作业队列设计为运行所有后台任务,而Job Scheduler仅设计用于可以延迟的任务。

使用作业队列的一个好办法是将所有网络任务写入作业,并使用AsyncTasks进行磁盘访问(例如从sqlite加载数据)。如果您有长时间运行的后台操作(例如处理图像),最好使用作业队列。

从v2开始,作业队列可以与JobScheduler或GCMNetworkManager集成。此集成允许作业队列根据作业的标准唤醒应用程序。你可以在相关的wiki页面看到详细描述。Scheduler API非常灵活,如果您的目标市场没有Google Play服务,您可以实现自定义版本。

揭开面纱

优点

着手接入

我们通过maven中心仓库分发工件。
Gradle: compile 'com.birbit:android-priority-jobqueue:2.0.1'

我们强烈建议您检查如何配置作业管理器和单个作业。
- Configure job manager
- Configure individual jobs
- Review sample app
- Review sample configuration

迭代历史

2.0.1(Oct 11,2016)

如果队列已满,则固定高CPU使用率(#262)
处理作业调度程序的错误输入(#254)

2.0.0(2016年8月14日)

验证JobManager ids

2.0.0-beta3(2016年8月7日)

GCMNetworkManager中的小改进

2.0.0-beta2(2016年7月25日)

修复了关于取消持久性作业的错误(#212)
修复了持久队列中的游标泄漏(#206)
向BatchingScheduler添加自定义持续时间(#202)

2.0.0-beta1(2016年6月27日)

承诺最终2.0 API和向后兼容性
修正了一个错误,取消原因没有传递到onCancel如果Job决定不再试一次

2.0.0-alpha5(2016年6月21日)

重要修正与框架计划程序,它没有正确设置延迟

2.0.0-alpha4(2016年6月16日) - 最后计划的alpha版本(与api更改)

引入期限参数。作业将在其到达期限时运行(或取消),而不考虑其约束。
通过使基本作业完全瞬态,更容易编写自定义序列化程序。
将持久作业数据移动到单个文件,这将提高作业大小的限制。
如果作业序列化失败,JobManager将抛出异常。

2.0.0-alpha3(2016年5月28日)

新的onCancel API接收异常
更改了如何构建调度程序以避免NPE问题
新的ThreadPool配置允许为消费者创建自定义线程

2.0.0-alpha1(2016年3月26日)

有70多个提交的重大重写
迁移指南

1.3.5(2015年11月7日)

默认NetworkUtil现在是Doze意识。 (感谢@coltin)
RetryConstraint延迟可应用于组以保留作业的执行顺序。 (#41)

1.3.4(2015年9月12日)

修复了由主线程上的同步引起的潜在ANR。问题#40

1.3.3 2015年7月12日

固定的默认指数退避。问题#33

1.3.2(2015年7月5日)

添加了在重试前更改作业优先级或添加延迟的功能。此机制可用于向作业添加指数退避。
添加了作业#getApplicationContext作为方便的方法来获取作业中的上下文。

1.3.1(2015年4月19日)

修复了问题#19,如果该组中的作业在运行时被取消,然后onRun失败,该组永远阻止该组。
更新Robolectric版本,并将所有测试移动到Gradle。
再见Cobertura,欢迎Jacoco!

1.3(2015年3月23日)

能够向作业添加标签。这些标记可用于以后检索作业。
增加了期待已久的工作取消。您可以使用标签取消作业。
删除已弃用的BaseJob类。这可能会破坏向后兼容性。

1.1.2(2014年2月18日)

如果addInBackground失败,则报告异常到记录器。 (#31)

1.1.1(2014年2月8日)

修复了一个重要的错误(#35),其中同一组中的作业可以并行运行,如果多个用户线程正在等待新作业,同时多个作业可用。

1.1(2014年1月30日)

作业状态查询API(#18)
修复了网络状态长时间变化后的stackoverflow bug。 (#21)

1.0(2014年1月14日):

为Job提供了更具可读性的参数化构造函数。
弃用BaseJob,有利于更完整的Job类。

0.9.9(2013年12月16日):

首次公开发布。

依赖库

Dependencies

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注