@zongwu
2017-01-05T08:02:35.000000Z
字数 1132
阅读 532
技术交流
这是一个常见的要求,有时你注意到一个Job将不再需要,例如当用户离开活动或用户取消操作。
为此,您可以使用作业标签来标识作业,并稍后引用它们以使用JobManager#cancelJobs或JobManager#cancelJobsInBackground取消。
请注意,如果作业已经在取消请求到达时运行,JobManager将等待,直到Job#onRun方法结束(因此没有线程中断停止作业)。 如果你有一个长时间运行的onRun方法,你可以检查Job#isCancelled,如果它返回true,只是抛出异常立即停止Job。
你可以在Job的构造函数中设置一个标签,
super(new Params(1).requireNetwork().persist().addTags("PICKME"));
然后,您可以从其他位置取消作业
jobManager.cancelJobsInBackground(null, TagConstraint.ANY, "PICKME");
下面是一个示例,说明如何取消为某个活动创建的所有作业,当它变为不可见时。 此示例使用onStart和onStop,但您也可以使用onCreate和onDestroy。
public class BaseActivity extends Activity {
...
// 当活动变为可见时生成的随机字符串标识符
private String sessionId;
// 优选注射
private JobManager jobManager;
public String getSessionId() {
return sessionId;
}
@Override
protected void onStart() {
super.onStart();
sessionId = UUID.randomUUID().toString();
}
@Override
protected void onStop() {
super.onStop();
// 这必须是异步,以避免阻塞主线程
jobManager.cancelJobsInBackground(null, TagConstraint.ANY, sessionId);
}
}
现在,您可以创建一个ActivityBoundJob,它使用BaseActivity作为构造函数参数,并自动绑定到给定的活动。
abstract class ActivityBoundJob extends Job {
public ActivityBoundJob(BaseActivity activity, Params params) {
super(params.addTags(activity.getSessionId()));
}
}