2017-12-04 11 views
2

私はアンドロイドアプリケーションでいくつかのバックグラウンド作業をしようとしています。ウェブでは、私はJobSchedulerを使っています。JobSchedulerの問題 - JobsServiceが複数回起動する

ジョブは、1回ではなく5-15回で発生することがあります。時々彼らは発砲しない。 私のテストデバイスは、5.1.1と7.0で動作します。ノーガットの人は、ロリポップの人よりも火を消しています。

これは私が私の仕事(5秒間隔でのみテストの目的のためである)を有効にする方法である:すべての3つのジョブ

fun enableTasks() { 
    val jobScheduler = App.getContext().getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler 

    if (PreferenceDao.getInstance().shouldUpdateJob()) jobScheduler.cancelAll() 

    scheduleJob(jobScheduler, MoniInfoJob.getJob()) 
    scheduleJob(jobScheduler, QueueJob.getJob()) 
    scheduleJob(jobScheduler, MontageOrderUpdateJob.getJob()) 

    PreferenceDao.getInstance().setJobUpdated() 
} 

private fun scheduleJob(jobScheduler: JobScheduler, jobInfo: JobInfo) { 
    val jobExists = jobScheduler.allPendingJobs.any { it.id == jobInfo.id } 
    if (!jobExists) jobScheduler.schedule(jobInfo) 
} 

を同じのようなものを見て私は一つだけを投稿:

JobService

class QueueJob : JobService() { 

override fun onStartJob(jobParameters: JobParameters?): Boolean { 
    val receiver = object : BroadcastReceiver() { 
     override fun onReceive(context: Context?, p1: Intent?) { 
      unregisterBroadcastReceiver(this) 
      jobFinished(jobParameters, false) 
     } 
    } 

    registerBroadcastReceiver(receiver) 
    MainController.startQueueService() 
    return true; 
} 

override fun onStopJob(jobParameters: JobParameters): Boolean { 
    Log.d(MontageOrderUpdateJob.TAG, "onStopJob") 
    return false; 
} 

private fun registerBroadcastReceiver(receiver: BroadcastReceiver) { 
    LocalBroadcastManager.getInstance(this).registerReceiver(receiver, IntentFilter(JOB_FINISHED)) 
} 

private fun unregisterBroadcastReceiver(receiver: BroadcastReceiver) { 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver) 
} 



companion object { 
    val TAG = QueueJob::class.java.name 
    val jobId: Int = 2 
    val JOB_FINISHED = TAG + "_finished" 

    fun getJob(): JobInfo { 
     val builder = JobInfo.Builder(jobId, ComponentName(App.getContext(), TAG)) 
     builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) 
     builder.setPeriodic(5000L) 
     builder.setPersisted(true) 
     return builder.build() 
    } 
} 
} 

そしてJobIntentService

class QueueService : JobIntentService() { 

private val TAG = QueueService::class.java.name 

override fun onHandleWork(intent: Intent) { 
    try { 
     Log.d(TAG, "Jobservice started") 
     TimerecordQueue().workThroughQueue() 
     DangerAllowanceQueue().workThroughQueue() 
     ProjektEndQueue().workThroughQueue() 
     PhotoUploadQueue().workThroughQueue() 
    } finally { 
     sendFinishedBroadcast() 
    } 
} 

private fun sendFinishedBroadcast() { 
    val jobFinishedIntent = Intent(QueueJob.JOB_FINISHED) 
    LocalBroadcastManager.getInstance(this).sendBroadcast(jobFinishedIntent) 
} 
} 

答えて

0

私は一度同様の問題を抱えていました。私の問題は、私が既存のスケジュールをチェックしなかったことでした。 同じことをする必要がありますか?

+0

"enableTasks()"関数で既存のスケジュールをチェックします –

関連する問題