title: Scheduled job executes multiple time in Evernote- AndroidJob
body: <p>I have one periodic job I want to run and it is implemented with the help of Evernote's Android Job library.</p>
  
  <p>What I wish to achieve is to updateMyLocation ever 15 mins.</p>
  
  <p>The problem is that every 15 mins, the job seems to be executing multiple times.</p>
  
  <p>I tested using a OnePlus3 device and from debugging, I observed that the 
  <code>LocationUpdateJob.schedule()</code> is called only once, which is correct, but the <code>LocationUpdateJob.onRunJob()</code> gets called multiple times, which is incorrect, but should only be called once every 15 mins.</p>
  
  <p>Additionally, illegalStateExceptions are thrown from some devices, according to crashlytics. 
  This particular exception only happens on Android 7 devices.</p>
  
  <p>Here is the crash from crash report:</p>
  
  <pre><code>    Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mydomain.myapp/MainActivity}: java.lang.IllegalStateException: Apps may not schedule more than 100 distinct jobs
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2947)
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3008)
         at android.app.ActivityThread.-wrap14(ActivityThread.java)
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
         at android.os.Handler.dispatchMessage(Handler.java:102)
         at android.os.Looper.loop(Looper.java:154)
         at android.app.ActivityThread.main(ActivityThread.java:6688)
         at java.lang.reflect.Method.invoke(Method.java)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
  Caused by java.lang.IllegalStateException: Apps may not schedule more than 100 distinct jobs
         at android.os.Parcel.readException(Parcel.java:1701)
         at android.os.Parcel.readException(Parcel.java:1646)
         at android.app.job.IJobScheduler$Stub$Proxy.schedule(IJobScheduler.java:158)
         at android.app.JobSchedulerImpl.schedule(JobSchedulerImpl.java:42)
         at com.evernote.android.job.v21.JobProxy21.schedule(SourceFile:198)
         at com.evernote.android.job.v21.JobProxy21.plantPeriodic(SourceFile:92)
         at com.evernote.android.job.JobManager.scheduleWithApi(SourceFile:282)
         at com.evernote.android.job.JobManager.schedule(SourceFile:240)
         at com.evernote.android.job.JobRequest.schedule(SourceFile:366)
         at com.mydomain.myapp.service.locationUpdate.LocationUpdateJob.schedule(SourceFile:33)
         at com.mydomain.myapp.activities.HubActivity.onLoginSuccess(SourceFile:173)
         at com.mydomain.myapp.activities.HubActivity.onCreate(SourceFile:115)
         at android.app.Activity.performCreate(Activity.java:6912)
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2900)
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3008)
         at android.app.ActivityThread.-wrap14(ActivityThread.java)
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
         at android.os.Handler.dispatchMessage(Handler.java:102)
         at android.os.Looper.loop(Looper.java:154)
         at android.app.ActivityThread.main(ActivityThread.java:6688)
         at java.lang.reflect.Method.invoke(Method.java)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
  </code></pre>
  
  <p>Here is my code :</p>
  
  <p><strong>Applicataion class</strong></p>
  
  <pre><code>@Override
  public void onCreate() {
   //init things....
   JobManager
             .create(this)
             .addJobCreator(new LocationUpdateJobCreator());  
   }
  </code></pre>
  
  <p><strong>LocationUpdateJobCreator</strong></p>
  
  <pre><code>public class LocationUpdateJobCreator implements JobCreator {
  
      @Override
      public Job create(String s) {
          switch (s) {
              case LocationUpdateJob.TAG:
                  return new LocationUpdateJob();
              default:
                  return null;
          }
      }
  }
  </code></pre>
  
  <p><strong>MainActivity :</strong></p>
  
  <pre><code>private void onLogin() {
     // do other things...
     LocationUpdateJob.schedule();
   }
  </code></pre>
  
  <p><strong>LocationUpdateJob</strong></p>
  
  <pre><code>public class LocationUpdateJob extends Job {
  
      public static final String TAG = "LocationUpdateJob";
      private static int jobId = -1;
  
  
      public static void schedule() {
          final long INTERVAL = 900000L;
          final long FLEX = 300000L;
          jobId = new JobRequest
                  .Builder(LocationUpdateJob.TAG)
                  .setPeriodic(INTERVAL, FLEX)
                  .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
                  .build()
                  .schedule();
      }
  
  
      public static void stop() {
          JobManager
                  .instance()
                  .cancel(jobId);
      }
  
  
      @NonNull
      @Override
      protected Result onRunJob(Params params) {
          updateLocation();
          return Result.SUCCESS;
      }
  }
  </code></pre>
  
  <p>I forked the Evernote's sample project, but they do the exact same steps, but I couldn't figure out what I am doing differently. </p>