[关闭]
@zongwu 2017-01-05T08:02:35.000000Z 字数 1132 阅读 532

Canceling Jobs

技术交流


简述

这是一个常见的要求,有时你注意到一个Job将不再需要,例如当用户离开活动或用户取消操作。

为此,您可以使用作业标签来标识作业,并稍后引用它们以使用JobManager#cancelJobs或JobManager#cancelJobsInBackground取消。

请注意,如果作业已经在取消请求到达时运行,JobManager将等待,直到Job#onRun方法结束(因此没有线程中断停止作业)。 如果你有一个长时间运行的onRun方法,你可以检查Job#isCancelled,如果它返回true,只是抛出异常立即停止Job。

举例

你可以在Job的构造函数中设置一个标签,

  1. super(new Params(1).requireNetwork().persist().addTags("PICKME"));

然后,您可以从其他位置取消作业

  1. jobManager.cancelJobsInBackground(null, TagConstraint.ANY, "PICKME");

取消活动的作业

下面是一个示例,说明如何取消为某个活动创建的所有作业,当它变为不可见时。 此示例使用onStart和onStop,但您也可以使用onCreate和onDestroy。

  1. public class BaseActivity extends Activity {
  2. ...
  3. // 当活动变为可见时生成的随机字符串标识符
  4. private String sessionId;
  5. // 优选注射
  6. private JobManager jobManager;
  7. public String getSessionId() {
  8. return sessionId;
  9. }
  10. @Override
  11. protected void onStart() {
  12. super.onStart();
  13. sessionId = UUID.randomUUID().toString();
  14. }
  15. @Override
  16. protected void onStop() {
  17. super.onStop();
  18. // 这必须是异步,以避免阻塞主线程
  19. jobManager.cancelJobsInBackground(null, TagConstraint.ANY, sessionId);
  20. }
  21. }

现在,您可以创建一个ActivityBoundJob,它使用BaseActivity作为构造函数参数,并自动绑定到给定的活动。

  1. abstract class ActivityBoundJob extends Job {
  2. public ActivityBoundJob(BaseActivity activity, Params params) {
  3. super(params.addTags(activity.getSessionId()));
  4. }
  5. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注