2017-04-19 25 views
3

jobserviceを呼び出すjobschedulerを実装しようとしていますが、これは5分ごとに特定のgeoLocationに費やされた時間を取得するトリガです。下のコードはMarshmallow以上で動作していますが、ロリポップ以下ではクラッシュします。 これはロリポップのために働くだろう、このいずれかを試してみてくださいjava.lang.NoSuchMethodError:いいえ仮想メソッドgetSystemService

04-19 11:38:25.358 1986-4658/com.eonelectric.eon E/AndroidRuntime: FATAL EXCEPTION: IntentService[GeofenceTransitionsIS] 
                   Process: com.eonelectric.eon, PID: 1986 
                   java.lang.NoSuchMethodError: No virtual method getSystemService(Ljava/lang/Class;)Ljava/lang/Object; in class Landroid/content/Context; or its super classes (declaration of 'android.content.Context' appears in /system/framework/framework.jar) 
                    at com.eonelectric.eon.GeneralUtil.startSyncAlarm(GeneralUtil.java:440) 
                    at com.eonelectric.eon.beatTrack.GeofenceTransitionsIntentService.getGeofenceTransitionDetails(GeofenceTransitionsIntentService.java:137) 
                    at com.eonelectric.eon.beatTrack.GeofenceTransitionsIntentService.onHandleIntent(GeofenceTransitionsIntentService.java:96) 
                    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
                    at android.os.Handler.dispatchMessage(Handler.java:102) 
                    at android.os.Looper.loop(Looper.java:135) 
                    at android.os.HandlerThread.run(HandlerThread.java:61) 
+0

私は同じ問題に直面しています。あなたはそれに対して何か解決策がありますか? – Jordon

+0

私はAlarmManagerを以下のロリポップ(API 21)に、JobSchedulerをMarshmallow以上に使用しています。今はクラッシュしていません。まだJobSchedulerは正確な時間(5分)でサービスを起動していない、バックグラウンドスレッドを殺すOSかもしれない。 AlarmManagerがバッテリを使い過ぎています。 @ジョーダン –

+0

私のためにJobSchedulerはmarshmallowに取り組んでいます.10秒間隔で試してみましたが、うまくいきました。あなたはAndroid Nでジョブスケジューラをチェックしましたか?私にとってJobはAndroid Nで一度だけ呼び出されています。 – Jordon

答えて

1

>これは私のログエラー - である>

JobScheduler jobScheduler = context.getSystemService(JobScheduler.class); 

エラー - を作るように私のコード - >

ComponentName serviceComponent = new ComponentName(context, SyncDbToServerJobService.class); 
     JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent); 
     PersistableBundle bundle = new PersistableBundle(); 
     bundle.putString(Constants.ENTERED_TIME, enteredTime); 
     builder.setPeriodic(intervalMillis).setExtras(bundle).setPersisted(true); 
     builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); // require unmetered network 
     builder.setRequiresDeviceIdle(true); // device should be idle 
     builder.setRequiresCharging(false); // we don't care if the device is charging or not 
     JobScheduler jobScheduler = context.getSystemService(JobScheduler.class); 
     jobScheduler.schedule(builder.build()); 

これです

ComponentName jobService = new ComponentName(getApplicationContext().getPackageName(), SyncService.class.getName()); JobInfo.Builder builder = new JobInfo.Builder(0, jobService); builder.setPeriodic(10000); builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); jobScheduler = (JobScheduler) this.getSystemService(JOB_SCHEDULER_SERVICE); jobScheduler.schedule(builder.build());

+0

それは動作するかもしれません。 DOZEモードの問題を処理するためにJobSchedulerが起動し、DozeモードがMarshmallow/Nougatに登場しました。だから私はコードを処理しています - if(android.os.Build.VERSION.SDK_INT <= 21){ GeneralUtil.startSyncAlarmLollipop(context、enteredTime); } else { GeneralUtil.startSyncAlarm(context、enteredTime); } –

+0

GeneralUtil.startSyncAlarmLollipop(context、enteredTime) - このメソッドでは、AlarmManagerとPendingIntentを使用してBroadcastReceiverを呼び出しています。 GeneralUtil.startSyncAlarm(context、enteredTime) - このメソッドでは、JobSchedulerを使用しています。 –

関連する問題