首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从不调用Evernote Android_JOB onRunJob()方法

从不调用Evernote Android_JOB onRunJob()方法
EN

Stack Overflow用户
提问于 2018-12-07 07:19:15
回答 2查看 561关注 0票数 0

我已经在我的Android应用程序中实现了Evernote android作业

代码语言:javascript
复制
implementation 'com.evernote:android-job:1.2.6'

我定义为signleton来获取实例,我在我的Application类中通过

代码语言:javascript
复制
 JobManager.create(this).addJobCreator(new CreatingJob());

我有两个类,它们是作业创建类

代码语言:javascript
复制
  public class CreatingJob implements JobCreator {
    @Nullable
    @Override
    public Job create(@NonNull String tag) {
        switch (tag) {
            case SyncMasterDataJOB.TAG:
                return new SyncMasterDataJOB();
        }
        return null;
    }
}

作业类

代码语言:javascript
复制
    public class SyncMasterDataJOB extends Job  {
    public static final String TAG = "job_note_sync";


    @NonNull
    @Override
    protected Result onRunJob(@NonNull Params params) {
        //Doing my Task HERE
        MyLog.ShowELog("JOB STARTED", "Job Has been Started");
        MyToast.Lmsg(getContext(), "Job Has been Started");
        return Result.SUCCESS;
    }


    public static void scheduleJob() {
        Set<JobRequest> jobRequests = JobManager.instance().getAllJobRequestsForTag(SyncMasterDataJOB.TAG);
        if (!jobRequests.isEmpty()) {
            return;
        }
        new JobRequest.Builder(SyncMasterDataJOB.TAG)
              .setPeriodic(MIN_INTERVAL, MIN_FLEX)
               .build()
                .schedule();
    }


}

但是问题是我的onRunJob()方法从来没有被调用过。我是刚接触Android工作的人。有人能告诉我我哪里做错了吗?

我正在参考这里的资料

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-07 09:00:27

作业创建者类->

代码语言:javascript
复制
public class CreateJob implements JobCreator {

    private Context context;

    public CreateJob(Context context){
        this.context = context;
    }

    //  Here we have to register each of the jobs...
    @Nullable
    @Override
    public Job create(@NonNull String tag) {
        switch (tag) {
            case CurrentWeatherUpdateJob.TAG:
                return new CurrentWeatherUpdateJob();
            default:
                return null;
        }
    }
}

这就是我注册JobCreator的地方。

代码语言:javascript
复制
//  To use StartingPoint Anywhere in our app
//  else you have to Instantiate StartingPoint inside every Activities on create...
public class StartingPoint extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //  Create Job is a class that registers all the Jobs...
        JobManager.create(this).addJobCreator(new CreateJob(getApplicationContext()));

    }
}

这是您的乔布斯子类->

代码语言:javascript
复制
public class CurrentWeatherUpdateJob extends Job {

    public static final String TAG = "CurrentWeatherUpdateJob";

    //  Update Weather Data every 15 Minutes...
    private static final int CURRENTWEATHERUPDATE_TIMEINTERVAL = 15 * 60 * 1000;

    //  Interface that provides Data...
    private ApiInterface service;

    //  For Celcius - metric / Kelvin - imperial
    private String UnitType = "metric";

    public CurrentWeatherUpdateJob() {
        service = APIClient.getRetrofit_Weather().create(ApiInterface.class);
    }

    private static void ScheduleJobEvery15Minutes() {
        //  Scheduling Job After every 15 minutes...
        new JobRequest.Builder(TAG)
                .setPeriodic(CURRENTWEATHERUPDATE_TIMEINTERVAL)
                .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
                .setRequirementsEnforced(true)
                .setUpdateCurrent(true)
                .build()
                .schedule();
    }

    // implement your onRunJob method here
}

从您想要的活动中调用ScheduleJobEvery15Minutes()方法。

票数 1
EN

Stack Overflow用户

发布于 2018-12-07 07:51:13

问题不在您的代码中,而是在职务期间的设置中。evernote只适用于周期性作业>=15 Min,而您使用1分钟作为运行作业的时间段。请参阅基于作业调度器的作业文档,因为作业调度程序对运行周期性作业具有相同的约束。

代码语言:javascript
复制
private void schedulePeriodicJob() {
    int jobId = new JobRequest.Builder(DemoSyncJob.TAG)
            .setPeriodic(TimeUnit.MINUTES.toMillis(15), TimeUnit.MINUTES.toMillis(5))
            .build()
            .schedule();
}

这是他们在库文档中添加的代码。请看看这个。->

为什么周期作业的间隔不能小于15分钟?这个库是3个不同API的子集。由于Android,定期工作的最低间隔是15分钟。虽然pre设备支持较小的间隔,但对于这个库,选择了最不常见的任务,以便在所有设备上以相同的频率运行定期作业。

使用Android的JobScheduler允许设置较小的间隔,但是值会被静默地调整,并被记录为警告。这个库会抛出一个异常,这样错误的工作就会被提前捕获。你可以在这里读到更多关于它的内容。

这是为我工作的代码->

每15分钟更新一次天气数据.

代码语言:javascript
复制
private static final int CURRENTWEATHERUPDATE_TIMEINTERVAL = 15 * 60 * 1000;

  private static void ScheduleJobEvery15Minutes() {
        //  Scheduling Job After every 15 minutes...
        new JobRequest.Builder(TAG)
                .setPeriodic(CURRENTWEATHERUPDATE_TIMEINTERVAL)
                .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
                .setRequirementsEnforced(true)
                .setUpdateCurrent(true)
                .build()
                .schedule();
    }

编辑->也检查Jobcreator类,您将返回空值如下,

代码语言:javascript
复制
public class CreatingJob implements JobCreator {
    @Nullable
    @Override
    public Job create(@NonNull String tag) {
        switch (tag) {
            case SyncMasterDataJOB.TAG:
                return new SyncMasterDataJOB();
        }
        return null;
    }

将代码更改为此->

代码语言:javascript
复制
public class CreatingJob implements JobCreator {
        @Nullable
        @Override
        public Job create(@NonNull String tag) {
            switch (tag) {
                case SyncMasterDataJOB.TAG:
                    return new SyncMasterDataJOB();
                case default:
                    return null;
            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53664952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档