Я использую последнюю версию 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");
}
Это всегда сообщает «Запланировано ОК»