Почему Xamarin Forms Android Job Scheduler также не соблюдает график - PullRequest
0 голосов
/ 17 сентября 2018

Я использую последнюю версию Xamarin Forms 3.1.0 и пытаюсь запланировать ежедневную отправку информации обратно на сервер.Я использую JobSchedulerService с SetPeriodic (24 *3600* 1000), который ссылается на JobService ниже.

Это запускается и работает нормально, но продолжает перепланирование и работает с постоянно уменьшающимися интервалами (как можно ожидать, если невыполненная задача будет перепланирована с более длительными интервалами).

Однако в logcat нет ничего, что указывало бы на ошибку.

Операторы Logger - это просто попытка отследить, что происходит, но я всегда вижу оператор «FINISHED:», а не сообщение «FAULTED», так что задача, по-видимому, не выполняется. Что я делаю неправильно?

public class AdherenceReportingJob : JobService
{
    static readonly string logClassName = typeof(AdherenceReportingJob).ToString();

    public override bool OnStartJob(JobParameters jobParams)
    {
        Logger.Audit(logClassName, "START");
        Task.Factory.StartNew(() =>
        {
            bool updateRan = false;
            updateRan = AdherenceCalculator.AdherenceReporting();

            // Have to tell the JobScheduler the work is done. 
            JobFinished(jobParams, false);
            Logger.Audit(logClassName, "FINISHED:" + updateRan);

        }).ContinueWith(t =>
        {
            Logger.Error(logClassName, "FAULTED");
            Logger.Error(logClassName, t.Exception.InnerException);
            JobFinished(jobParams, true);
        }, TaskContinuationOptions.OnlyOnFaulted);

        // Return true because of the asynchronous work
        return true;
    }

    public override bool OnStopJob(JobParameters jobParams)
    {
        // we don't want to reschedule the job if it is stopped or cancelled.
        Logger.Audit(logClassName, "START");
        return false;
    }

}

Задание запланировано с использованием:

        var javaClass = Java.Lang.Class.FromType(typeof(AdherenceReportingJob));
        var componentName = new ComponentName(Application.Context, javaClass);
        var jobBuilder = new JobInfo.Builder(ADHERENCE_REPORT_JOB, componentName);
        jobBuilder.SetPeriodic(App.OneDay);
        jobBuilder.SetRequiredNetworkType(NetworkType.Any); // Need network to report back
        var jobInfo = jobBuilder.Build();

        var jobScheduler = (JobScheduler) Application.Context.GetSystemService(JobSchedulerService);

        var scheduleResult = jobScheduler.Schedule(jobInfo);

        if (JobScheduler.ResultSuccess == scheduleResult)
        {
            Logger.Debug(logClassName, "Scheduled OK");
        }
        else
        {
            Logger.Error(logClassName, "Scheduled FAILED");
        }

Это всегда сообщает «Запланировано ОК»

...