El programador de tareas no se ejecuta dentro del intervalo establecido

Estoy tratando de utilizar el androide Job Scheduler API y todo lo que estoy tratando de hacer es tener el Job Scheduler ejecutar cada 5 segundos. Sin embargo, cuando lo ejecuto, el servicio correspondiente se golpea cada dos minutos. Tengo un registro que los documentos cada vez que se golpea el servicio. No estoy seguro de por qué esto está sucediendo. ¿Podría el programador de tareas tener un intervalo de tiempo mínimo. Mi código es simplemente …

JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(this, UpdateDatabaseService.class)) .setPeriodic(5000) .build(); JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(jobInfo); 

El problema surgió originalmente cuando estaba tratando de ejecutar una tarea diaria, pero que desencadenaría el servicio varias veces dentro de ese día y no seguiría la guía de tiempo.

Déjame saber lo que piensas.

    JobInfo.Builder builder = new JobInfo.Builder(1,new ComponentName(getPackageName(), JobSchedulerService.class.getName()));

    builder.setPeriodic(3000);


    Editado

    MainActivity.java

     public class MainActivity extends Activity { private JobScheduler mJobScheduler; private Button mScheduleJobButton; private Button mCancelAllJobsButton; @Override protected void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_main ); mJobScheduler = (JobScheduler) getSystemService( Context.JOB_SCHEDULER_SERVICE ); mScheduleJobButton = (Button) findViewById( R.id.schedule_job ); mCancelAllJobsButton = (Button) findViewById( R.id.cancel_all ); mScheduleJobButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { JobInfo.Builder builder = new JobInfo.Builder( 1, new ComponentName( getPackageName(), JobSchedulerService.class.getName() ) ); builder.setPeriodic( 3000 ); if( mJobScheduler.schedule( builder.build() ) <= 0 ) { //If something goes wrong } } }); mCancelAllJobsButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick( View v ) { mJobScheduler.cancelAll(); } }); } } 

    solo hay que cambiar

     new JobInfo.Builder(1, new ComponentName(this, UpdateDatabaseService.class)) 

    a

     new JobInfo.Builder( 1, new ComponentName( getPackageName(), JobSchedulerService.class.getName() ) ) 

    builder.setPeriodic( 3000 ); establecerá JobInfo en el JobInfo de 3000 ms y se llamará cada 3 segundos.

    JobSchedulerService.java

     public class JobSchedulerService extends JobService { private Handler mJobHandler = new Handler( new Handler.Callback() { @Override public boolean handleMessage( Message msg ) { Toast.makeText( getApplicationContext(), "JobService task running", Toast.LENGTH_SHORT ).show(); jobFinished( (JobParameters) msg.obj, false ); return true; } } ); @Override public boolean onStartJob(JobParameters params ) { mJobHandler.sendMessage( Message.obtain( mJobHandler, 1, params ) ); return true; } @Override public boolean onStopJob( JobParameters params ) { mJobHandler.removeMessages( 1 ); return false; } } 

    AndroidManifest.xml

     <service android:name=".JobSchedulerService" android:permission="android.permission.BIND_JOB_SERVICE" /> 

    activity_main.xml

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/schedule_job" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Schedule Job"/> <Button android:id="@+id/cancel_all" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Cancel All"/> </LinearLayout> 

    Yo estaba teniendo este problema y después de revisar algunos blogs y la documentación oficial, me di cuenta de que JobScheduler está teniendo un comportamiento de diferencia en Android N (24 y 25). JobScheduler funciona con un mínimo de 15 minutos.

     @TargetApi(Build.VERSION_CODES.LOLLIPOP) @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public static void setJobScheduler(Context context){ Log.v(TAG, "Job Scheduler is starting"); JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE); ComponentName serviceName = new ComponentName(context, JobService.class); JobInfo jobInfo; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){ jobInfo = new JobInfo.Builder(JOB_ID, serviceName) .setPeriodic(15000) .build(); }else{ jobInfo = new JobInfo.Builder(JOB_ID, serviceName) .setPeriodic(Constants.TIME_INTERVAL) .build(); } jobScheduler.schedule(jobInfo); } 

    Debería llamar a jobFinished(jobParams,needResheduleBoolean); , después de esta llamada sólo el trabajo se ejecutará de nuevo, así es como el trabajo sabe que ha terminado la ejecución por lo que puede comenzar una vez más.

    En lugar de setPeriodic(int) use setMinimumLatency(int) con setOverrideDeadline(int) . Estos dos métodos ajustarán el intervalo de JobScheduler .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.