代码之家  ›  专栏  ›  技术社区  ›  Mark F

FireBase作业调度程序未调度

  •  1
  • Mark F  · 技术社区  · 6 年前

    我看了好几个答案,但什么也找不到。有人知道我的FireBaseDispatcher为什么不执行吗?我在1到5秒之间设置了一个触发窗口,看看它是否工作。 我的应用程序启动,并从实用程序类调用此方法:

    private static void scheduleFirebaseJobSync(@NonNull final Context context){
    
        try {
            com.firebase.jobdispatcher.Driver driver = new GooglePlayDriver(context);
            FirebaseJobDispatcher firebaseJobDispatcher = new FirebaseJobDispatcher(driver);
    
            Job syncJob = firebaseJobDispatcher.newJobBuilder()
                    .setService(FireBaseJobService.class)
                    .setTag(WEATHER_SYNC_TAG)
                    .setConstraints(Constraint.ON_ANY_NETWORK)
                    .setLifetime(Lifetime.FOREVER)
                    .setRecurring(true)
                    .setTrigger(Trigger.executionWindow(1,5))
                    .setReplaceCurrent(true)
                    .build();
            firebaseJobDispatcher.schedule(syncJob);
        }
    

    下面是FireBaseJobService类,它被称为:

    public class FireBaseJobService extends JobService {
    private AsyncTask<Void,Void,Void> fetchMovieDate;
    
    @Override
    public boolean onStartJob(final JobParameters job) {
        fetchMovieDate = new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
    
                Context context = getApplicationContext();
                WeatherSyncTask.syncWeatherDB(context);
                jobFinished(job,false);
                Log.d("FIREBASEJOB", "IN FIRE BASE JOB FINISHED");
                return null;
            }
            @Override
            protected void onPostExecute(Void aVoid) {
                jobFinished(job,false);
            }
        };
        fetchMovieDate.execute();
        return true;
    }
    
    @Override
    public boolean onStopJob(JobParameters job) {
        if (fetchMovieDate!=null){
            fetchMovieDate.cancel(true);
        }
    
        return true;
    }}
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   jantursky    6 年前

    在androidmanifest.xml中注册权限:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    在androidmanifest.xml中添加服务声明:

    <service
        android:exported="false"
        android:name=".FireBaseJobService ">
        <intent-filter>
            <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
        </intent-filter>
    </service>
    

    使用以下两个选项之一分派作业:

    firebaseJobDispatcher.schedule(syncJob);
    firebaseJobDispatcher.mustSchedule(syncJob);
    

    工作服务的内容是:

    public class FireBaseJobService extends JobService {
    
        @Override
        public boolean onStartJob(final JobParameters job) {
            WeatherSyncTask.syncWeatherDB(getApplicationContext());
            return false;
        }
    
        @Override
        public boolean onStopJob(JobParameters job) {
            return true;
        }}
    }
    
        2
  •  0
  •   android_dev71    5 年前

    除了下面的所有其他答案,不要忘记使用最近的FireBase JobDispatcher lib。

    在我的例子中,请求中的代码结构相同,并且在实现了下面Jantursky的建议之后,通过将build.gradle中导入的firebase lib版本更改为最新版本来解决这个问题。

    我有: 实现“com.firebase:firebase jobDispatcher:0.5.0”

    然后我把: 实现“com.firebase:firebase jobDispatcher:0.8.5”

    也许最近的一个也会一样。