博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JobScheduler之超时检查
阅读量:6262 次
发布时间:2019-06-22

本文共 3717 字,大约阅读时间需要 12 分钟。

文中的源代码版本为api23

JobScheduler之超时检查

JobServiceContextJobService交互的过程中会JobServiceContext会进行超时检查,下面我们来看看超时检查是怎么做的。 我们需要解决的主要问题是:

  1. 哪些操作会执行超时检查
  2. 超时时间是多少
  3. 一旦发生超时JobServiceContext会怎么处理

哪些操作会执行超时检查

JobServiceContext中使用一个名为scheduleOpTimeOut的方法来执行超时检查,那么哪些地方会调用该方法呢? 通过全局搜索发现有以下调用点:

  1. 执行服务的bind操作时
boolean executeRunnableJob(JobStatus job) {    synchronized (mLock) {        //...        scheduleOpTimeOut();        final Intent intent = new Intent().setComponent(job.getServiceComponent());        boolean binding = mContext.bindServiceAsUser(intent, this,                Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND,                new UserHandle(job.getUserId()));        //...        return true;    }}复制代码
  1. 触发JobService.onStartJob方法时
private void handleServiceBoundH() {    //...    try {        mVerb = VERB_STARTING;        scheduleOpTimeOut();        service.startJob(mParams);    } catch (RemoteException e) {        Slog.e(TAG, "Error sending onStart message to '" +                mRunningJob.getServiceComponent().getShortClassName() + "' ", e);    }}复制代码
  1. 等待JobService异步执行任务的期间
private void handleStartedH(boolean workOngoing) {    switch (mVerb) {        case VERB_STARTING:            mVerb = VERB_EXECUTING;            if (!workOngoing) {                // Job is finished already so fast-forward to handleFinished.                handleFinishedH(false);                return;            }            //...            //workOngoing为true表示JobService            //需要异步执行任务,完成任务后需要调用            //jobFinished方法通知JSC            scheduleOpTimeOut();            break;        default:            //...            return;    }}复制代码
  1. 停止JobService
private void sendStopMessageH() {    removeOpTimeOut();    //...    try {        mVerb = VERB_STOPPING;        scheduleOpTimeOut();        service.stopJob(mParams);    } catch (RemoteException e) {        //...    }}复制代码

可以发现,JobService在执行每一步操作的时候都会有超时检查。

超时时间是多少

这个问题就需要我们来看一下scheduleOpTimeOut方法了

private void scheduleOpTimeOut() {    removeOpTimeOut();        //有两个事件    final long timeoutMillis = (mVerb == VERB_EXECUTING) ?            EXECUTING_TIMESLICE_MILLIS : OP_TIMEOUT_MILLIS;    //log...    Message m = mCallbackHandler.obtainMessage(MSG_TIMEOUT);    mCallbackHandler.sendMessageDelayed(m, timeoutMillis);    mTimeoutElapsed = SystemClock.elapsedRealtime() + timeoutMillis;}复制代码

EXECUTING_TIMESLICE_MILLIS为10分钟,OP_TIMEOUT_MILLIS为8秒 从代码中我们可以发现超时时间有两个,不同的操作有不同的超时时间 mVerbVERB_EXECUTING的超时消息,只有在JobService执行异步任务时才会触发,因此我们可以将超时简单的分为两种:

  1. JobService异步任务执行超时(10mins)
  2. 跨进程调用超时(8s)

一旦发生超时JobServiceContext会怎么处理

JobServiceContext使用handleOpTimeoutH方法来处理超时

private void handleOpTimeoutH() {    switch (mVerb) {        case VERB_BINDING:            //log...            closeAndCleanupJobH(false /* needsReschedule */);            break;        case VERB_STARTING:            //log...            closeAndCleanupJobH(false /* needsReschedule */);            break;        case VERB_STOPPING:            //log...            closeAndCleanupJobH(true /* needsReschedule */);            break;        case VERB_EXECUTING:            //log...            sendStopMessageH();            break;        default:            //log...            closeAndCleanupJobH(false /* needsReschedule */);    }}复制代码

主要处理方法有closeAndCleanupJobHsendStopMessageH

  1. sendStopMessageH 该方法会立刻执行stopJob方法,通知JobService结束任务
  2. closeAndCleanupJobH 该方法会直接解绑JobService,我们之前讲过了此处不再赘述。唯一一点是,如果是跨进程执行stopJob方法超时的话,那么needsReschedule参数就为true

总结

  1. JobScheduler在执行服务绑定、跨进程调用JobService.onStartJobJobService.onStopJob以及JobService异步执行任务期间都会进行超时检查
  2. JobService异步执行超时时间为10mins,其他所有操作都是8s
  3. JobService异步执行超时后JobServiceContext会跨进程调用JobService.onStopJob。其他操作超时,会调用closeAndCleanupJobH直接解绑服务,如果是跨进程调用JobService.onStopJob时超时,则还会重新执行Job.

转载地址:http://kdupa.baihongyu.com/

你可能感兴趣的文章
MVC5 + EF6 简单示例
查看>>
Mysql Innodb存储引擎 insert 死锁分析
查看>>
好的用户界面-界面设计的一些技巧
查看>>
全端开发必备!10个最好的 Node.js MVC 框架
查看>>
初始Knockout
查看>>
HADOOP 2.6 INSTALLING ON UBUNTU 14.04 (hadoop 2.6 部署到ubuntu 14.04上面)
查看>>
OSSIM架构与组成综述
查看>>
用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目
查看>>
数据分析:基于Python的自定义文件格式转换系统
查看>>
如何重置Sitecore CMS中的管理员密码
查看>>
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
查看>>
NSBundle介绍
查看>>
POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
查看>>
ConnectString中enlist设置的含义
查看>>
潜移默化学会WPF(企业经验篇)--Log4Net(二)
查看>>
轻量级面向SQL的MySQL开源监控工具
查看>>
ubuntu 卸载 程序软件
查看>>
iOS 6,5支持 portrait,landscape (横竖屏的处理)
查看>>
FineUI v3.2.2发布了!(7 天后再出新版,给不给力?)
查看>>