Dispečer úloh Firebase
Tato příručka popisuje, jak naplánovat práci na pozadí pomocí knihovny dispečera úloh Firebase z Google.
Přehled
Jedním z nejlepších způsobů, jak udržet aplikaci pro Android odezvu na uživatele, je zajistit, aby se na pozadí prováděla složitá nebo dlouho běžící práce. Je ale důležité, aby práce na pozadí nepříznivě ovlivnila činnost uživatele se zařízením.
Úloha na pozadí se například může dotazovat na web každé tři nebo čtyři minuty, aby se dotazoval na změny konkrétní datové sady. To se jeví jako neškodné, ale mělo by mít katastrofální důsledky dopad na výdrž baterie. Aplikace bude zařízení znovu probudit, zvýšit výkon procesoru na vyšší stav napájení, zapněte rádiy, zajistěte síťové požadavky a pak výsledky zpracuje. To je horší, protože zařízení se okamžitě nevypne a vrátí se do stavu nečinnosti při nízkém výkonu. Nesprávně naplánovaná práce na pozadí může nechtěně udržovat zařízení ve stavu, který bude mít zbytečné a nadměrné požadavky na napájení. Tato zdánlivá Innocent aktivita (dotazování webu) vykreslí zařízení v poměrně krátké době jako nepoužitelné.
Android poskytuje následující rozhraní API, která usnadňují práci na pozadí, ale samotná není dostatečná pro inteligentní plánování úloh.
- Záměrové služby – záměrové služby jsou skvělé pro provádění práce, ale neposkytují žádný způsob, jak naplánovat práci.
- AlarmManager – tato rozhraní API umožňují plánovat práci, ale neposkytují žádný způsob, jak tuto práci skutečně provádět. AlarmManager také povoluje omezení na základě času, což znamená, že v určitou dobu vyvolala alarm nebo po uplynutí určité doby.
- JobScheduler – plán úlohy je skvělé rozhraní API, které funguje s operačním systémem pro plánování úloh. Je však k dispozici pouze pro aplikace pro Android, které cílí na úroveň rozhraní API 21 nebo vyšší.
- Přijímače všesměrového vysílání – aplikace pro Android může nastavit přijímače všesměrového vysílání, aby mohli provádět práci v reakci na události nebo záměry v celé soustavě. Přijímače všesměrového vysílání ale neposkytují žádnou kontrolu nad tím, kdy se má úloha spustit. Změny v operačním systému Android se taky omezí, pokud budou příjemci vysílání fungovat, nebo druhy práce, na které můžou reagovat.
Existují dvě klíčové funkce pro efektivní provádění práce na pozadí (někdy označované jako úloha na pozadí nebo úloha):
- Inteligentně naplánování práce – je důležité, aby při práci na pozadí aplikace prováděla jako dobrý občan. V ideálním případě by aplikace neměla vyžadovat spuštění úlohy. Místo toho by aplikace měla zadat podmínky, které musí být splněny při spuštění úlohy, a potom naplánovat, aby tato práce běžela při splnění podmínek. To umožňuje, aby Android inteligentně prováděl práci. Například síťové požadavky mohou být spouštěny ve stejnou dobu, aby se zajistilo maximální využití režie při používání sítě.
- Zapouzdření práce – kód, který provede práci na pozadí, by měl být zapouzdřen v diskrétní součásti, kterou lze spustit nezávisle na uživatelském rozhraní a bude poměrně snadné ho znovu naplánovat, pokud se práce z nějakého důvodu nezdařila.
Dispečer úloh Firebase je knihovna od společnosti Google, která poskytuje rozhraní Fluent API pro zjednodušení plánování práce na pozadí. Má být náhradou pro Google Cloud Manager. Dispečer úloh Firebase se skládá z následujících rozhraní API:
Firebase.JobDispatcher.JobServiceJe abstraktní třída, která musí být rozšířena pomocí logiky, která bude spuštěna v úloze na pozadí.Firebase.JobDispatcher.JobTriggerDeklaruje, kdy má být úloha spuštěna. Tato funkce se obvykle vyjadřuje v časovém intervalu, například před spuštěním úlohy alespoň 30 sekund, ale úlohu spusťte do 5 minut.Firebase.JobDispatcher.RetryStrategyObsahuje informace o tom, co je potřeba udělat, když se úloha nespustí správně. Strategie opakování určuje, jak dlouho se má čekat, než se pokusíte úlohu spustit znovu.Firebase.JobDispatcher.ConstraintJe volitelná hodnota, která popisuje podmínku, která musí být splněna, aby bylo možné úlohu spustit, například zařízení je v neměřené síti nebo zpoplatnění.Firebase.JobDispatcher.JobJe rozhraní API, které sjednocuje předchozí rozhraní API v nástroji na jednotku, která může být naplánovaná pomocíJobDispatcher.Job.BuilderTřída se používá k vytvoření instanceJob.Firebase.JobDispatcher.JobDispatcherNástroj používá předchozí tři rozhraní API k naplánování práce s operačním systémem a k tomu, aby v případě potřeby mohl v případě potřeby zrušit úlohy.
Aby bylo možné naplánovat práci s dispečerem úloh Firebase, musí aplikace Xamarin. Android zapouzdřovat kód v typu, který rozšiřuje JobService třídu. JobService má tři metody životního cyklu, které lze volat během životnosti úlohy:
bool OnStartJob(IJobParameters parameters)– Tato metoda je tam, kde práce proběhne a měla by být vždy implementovaná. Spouští se v hlavním vlákně. Tato metoda vrátítrue, pokud je zbývající práce, nebofalsePokud je práce dokončena.bool OnStopJob(IJobParameters parameters)– Tato funkce se volá, když se z nějakého důvodu zastaví úloha. Měla by se vrátit,truePokud se má úloha naplánovat později.JobFinished(IJobParameters parameters, bool needsReschedule)– Tato metoda se volá, když seJobServicedokončí jakákoli asynchronní práce.
K naplánování úlohy aplikace vytvoří instanci JobDispatcher objektu. Pak se Job.Builder použije k vytvoření Job objektu, který je k dispozici pro, JobDispatcher který se pokusí a naplánuje spuštění úlohy.
Tato příručka pojednává o tom, jak přidat dispečera úloh Firebase do aplikace Xamarin. Android a použít ji k naplánování práce na pozadí.
Požadavky
Dispečer úloh Firebase vyžaduje rozhraní Android API úrovně 9 nebo vyšší. Knihovna dispečera úloh Firebase spoléhá na některé součásti, které poskytuje Služby Google Play; zařízení musí mít nainstalovaný Služby Google Play.
Použití knihovny dispečera úloh Firebase v Xamarin. Android
pokud chcete začít s dispečerem úloh Firebase, přidejte do projektu xamarin. Android nejprve balíček xamarin. Firebase. JobDispatcher NuGet . vyhledejte NuGet Správce balíčků balíčku Xamarin. Firebase. JobDispatcher (který je stále v předběžné verzi).
Po přidání knihovny dispečerů úloh Firebase vytvořte JobService třídu a naplánujte ji tak, aby běžela s instancí FirebaseJobDispatcher .
Vytvoření JobService
Veškerou práci prováděnou knihovnou dispečerů úloh Firebase je třeba provést v typu, který rozšiřuje Firebase.JobDispatcher.JobService abstraktní třídu. Vytvoření JobService je velmi podobné jako při vytváření s využitím Service platformy Android:
- Rozšíří
JobServicetřídu - Tuto podtřídu seupravte pomocí
ServiceAttribute. I když není nezbytně nutné, doporučuje se explicitně nastavitNameparametr pro usnadnění laděníJobService. - Přidejte
IntentFilterk deklaraciJobServicevIntentFilter. Tato akce také pomůže knihovně dispečerů úloh Firebase vyhledat a vyvolatJobService.
Následující kód je příkladem nejjednoduššího JobService pro aplikaci, použití TPL k asynchronnímu provádění určité práce:
[Service(Name = "com.xamarin.fjdtestapp.DemoJob")]
[IntentFilter(new[] {FirebaseJobServiceIntent.Action})]
public class DemoJob : JobService
{
static readonly string TAG = "X:DemoService";
public override bool OnStartJob(IJobParameters jobParameters)
{
Task.Run(() =>
{
// Work is happening asynchronously (code omitted)
});
// Return true because of the asynchronous work
return true;
}
public override bool OnStopJob(IJobParameters jobParameters)
{
Log.Debug(TAG, "DemoJob::OnStartJob");
// nothing to do.
return false;
}
}
Vytvoření FirebaseJobDispatcher
Předtím, než bude možné naplánovat jakoukoli práci, je nutné vytvořit Firebase.JobDispatcher.FirebaseJobDispatcher objekt. FirebaseJobDispatcherZodpovídá za plánování a JobService . Následující fragment kódu je jedním ze způsobů, jak vytvořit instanci třídy FirebaseJobDispatcher :
// This is the "Java" way to create a FirebaseJobDispatcher object
IDriver driver = new GooglePlayDriver(context);
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(driver);
V předchozím fragmentu kódu GooglePlayDriver je třída, která pomáhá FirebaseJobDispatcher interakci s některými rozhraními API plánování v služby Google Play na zařízení. Parametr context je libovolný Android Context , například aktivita. V současné době GooglePlayDriver je jedinou IDriver implementací v knihovně dispečera úloh Firebase.
Vazba Xamarin. Android pro dispečera úloh Firebase poskytuje metodu rozšíření pro vytvoření FirebaseJobDispatcher z Context :
FirebaseJobDispatcher dispatcher = context.CreateJobDispatcher();
Po vytvoření FirebaseJobDispatcher instance je možné vytvořit Job a spustit kód ve JobService třídě. JobJe vytvořen Job.Builder objektem a bude popsán v následující části.
Vytvoření Firebase. JobDispatcher. job pomocí úlohy Job. Builder
Firebase.JobDispatcher.JobTřída zodpovídá za zapouzdření metadat potřebných ke spuštění JobService . JobObsahuje informace, jako je například jakékoli omezení, které musí být splněno před spuštěním úlohy, pokud Job je opakovaná nebo jakékoli triggery, které způsobí, že se úloha spustí. Jako minimální Job musí mít Job (jedinečný řetězec identifikující úlohu FirebaseJobDispatcher ) a typ JobService , který má být spuštěn. Dispečer úlohy Firebase vytvoří instanci, JobService Pokud je čas na spuštění úlohy. A Job je vytvořen pomocí instance Firebase.JobDispatcher.Job.JobBuilder třídy.
Následující fragment kódu je nejjednodušším příkladem, jak vytvořit Job pomocí vazby Xamarin. Android:
Job myJob = dispatcher.NewJobBuilder()
.SetService<DemoJob>("demo-job-tag")
.Build();
Provede Job.Builder některé základní kontroly ověřování na vstupních hodnotách úlohy. Výjimka bude vyvolána, pokud není možné Job.Builder vytvořit Job . Vytvoří se Job.BuilderJob s následujícími výchozími hodnotami:
JobJob(jak dlouho bude naplánována na spuštění) bude jenom až do restartování zařízení – Jakmile se zařízení restartuje, dojdeJobke ztrátě.- A není
Jobopakovaný – spustí se jenom jednou. JobBude naplánováno, aby se spouštěl co nejrychleji.- Výchozí strategie opakování pro
Jobje použitíJob(podrobněji popsaný v části Nastavení RetryStrategy).
Plánování úlohy
Po vytvoření je Job potřeba naplánovat, aby se FirebaseJobDispatcher spustilo před spuštěním. K dispozici jsou dvě metody plánování Job :
// This will throw an exception if there was a problem scheduling the job
dispatcher.MustSchedule(myJob);
// This method will not throw an exception; an integer result value is returned
int scheduleResult = dispatcher.Schedule(myJob);
Hodnota vrácená funkcí FirebaseJobDispatcher.Schedule bude jedna z následujících celočíselných hodnot:
FirebaseJobDispatcher.ScheduleResultSuccess–JobByl úspěšně naplánován.FirebaseJobDispatcher.ScheduleResultUnknownError– Došlo k některému neznámému problému, který brání vJobNaplánování.FirebaseJobDispatcher.ScheduleResultNoDriverAvailable– Použil se neplatnýIDriverneboIDriverbyl nějaký nedostupný.FirebaseJobDispatcher.ScheduleResultUnsupportedTrigger– SlužbaTriggernebyla podporována.FirebaseJobDispatcher.ScheduleResultBadService– Služba není správně nakonfigurovaná nebo není k dispozici.
Konfigurace úlohy
Je možné přizpůsobit úlohu. Mezi příklady toho, jak může být úloha přizpůsobená, patří následující:
- Předání parametrů do úlohy – může vyžadovat další hodnoty k provedení práce, například stažení souboru.
- Nastavení omezení – může být nutné spustit úlohu pouze v případě splnění určitých podmínek. Například spouštějte pouze
Jobpři účtování zařízení. - Určete, kdy se má spustit – dispečer úloh Firebase umožňuje aplikacím zadat čas, kdy se má úloha spustit.
- Deklarace strategie opakování pro neúspěšné úlohy – strategie opakování poskytuje pokyny k tomu, co dělat s tím, že se nedaří dokončit.
Každé z těchto témat bude podrobněji popsáno v následujících částech.
Předávání parametrů do úlohy
Parametry jsou předány do úlohy vytvořením Bundle metody, která je předána spolu s Job.Builder.SetExtras metodou:
Bundle jobParameters = new Bundle();
jobParameters.PutInt(FibonacciCalculatorJob.FibonacciPositionKey, 25);
Job myJob = dispatcher.NewJobBuilder()
.SetService<DemoJob>("demo-job-tag")
.SetExtras(jobParameters)
.Build();
K Bundle je k dispozici z IJobParameters.Extras vlastnosti v OnStartJob metodě:
public override bool OnStartJob(IJobParameters jobParameters)
{
int position = jobParameters.Extras.GetInt(FibonacciPositionKey, DEFAULT_VALUE);
// rest of code omitted
}
Nastavení omezení
Omezení můžou snížit náklady nebo baterie na zařízení. Firebase.JobDispatcher.ConstraintTřída definuje tato omezení jako celočíselné hodnoty:
Constraint.OnUnmeteredNetwork– Spusťte úlohu jenom v případě, že je zařízení připojené k neměřené síti. To je užitečné, když nechcete, aby uživatel vykonal poplatky za data.Constraint.OnAnyNetwork– Spusťte úlohu na libovolné síti, ke které je zařízení připojené. Pokud je zadaná společně sConstraint.OnUnmeteredNetwork, tato hodnota bude mít prioritu.Constraint.DeviceCharging– Úlohu spouštějte jenom v případě, že je zařízení zpoplatněné.
Omezení jsou nastavena pomocí Job.Builder.SetConstraint metody:
Job myJob = dispatcher.NewJobBuilder()
.SetService<DemoJob>("demo-job-tag")
.SetConstraint(Constraint.DeviceCharging)
.Build();
JobTriggerPoskytuje pokyny pro operační systém o tom, kdy se má úloha spustit. JobTriggerMá JobTrigger , které definuje naplánovaný čas, kdy se má Job Spustit. Okno spuštění má hodnotu počátečního okna a hodnotu koncového okna . Spouštěcí okno je počet sekund, po které má zařízení čekat před spuštěním úlohy a hodnota koncového okna je maximální počet sekund, po které se má čekat, než se spustí Job .
JobTriggerLze vytvořit pomocí Firebase.Jobdispatcher.Trigger.ExecutionWindow metody. Například Trigger.ExecutionWindow(15,60) znamená, že úloha by měla běžet 15 až 60 sekund od okamžiku, kdy je naplánována. Job.Builder.SetTriggerMetoda se používá k
JobTrigger myTrigger = Trigger.ExecutionWindow(15,60);
Job myJob = dispatcher.NewJobBuilder()
.SetService<DemoJob>("demo-job-tag")
.SetTrigger(myTrigger)
.Build();
Výchozí JobTrigger hodnota pro úlohu je reprezentovaná hodnotou Trigger.Now , která určuje, že se úloha po naplánování spustí co nejdříve.
Nastavení RetryStrategy
Firebase.JobDispatcher.RetryStrategyPoužívá se k určení, kolik zpoždění má zařízení použít, než se pokusí znovu spustit neúspěšnou úlohu. RetryStrategyMá RetryStrategy, která definuje, jaký časový základní algoritmus bude použit k opakovanému naplánování neúspěšné úlohy a okno spuštění, které určuje okno, ve kterém má být úloha naplánována. Toto okno přeplánování je definováno dvěma hodnotami. První hodnota je počet sekund, po které se má čekat před opětovným Naplánováním úlohy ( počáteční hodnota omezení rychlosti ), a druhým číslem je maximální počet sekund, než se úloha musí spustit ( maximální hodnota omezení rychlosti ).
Oba typy zásad opakování jsou identifikovány těmito hodnotami int:
RetryStrategy.RetryPolicyExponential–RetryStrategy.RetryPolicyExponentialnasadí počáteční hodnotu omezení rychlosti exponenciálně po každém selhání. Když úloha poprvé selže, knihovna počká _initial interval, který je zadaný před přeplánováním úlohy – příklad 30 sekund. Podruhé, když úloha selže, knihovna před pokusem o spuštění úlohy počká aspoň 60 sekund. Po třetím neúspěšném pokusu bude knihovna čekat 120 sekund atd. Výchozí hodnotaRetryStrategypro knihovnu dispečera úloh Firebase je reprezentovánaRetryStrategy.DefaultExponentialobjektem. Má počáteční omezení rychlosti 30 sekund a maximální omezení rychlosti 3600 sekund.RetryStrategy.RetryPolicyLinear– Tato strategie jeRetryStrategy.RetryPolicyLinear, že se má úloha naplánovat na spuštění v nastavených intervalech (až do úspěšného dokončení). Lineární omezení rychlosti je nejvhodnější pro práci, která musí být dokončena co nejdříve, nebo pro problémy, které se rychle vyřeší. Knihovna dispečera úloh Firebase definuje,RetryStrategy.DefaultLinearkterý má okno pro přeplánování aspoň na 30 sekund a až 3600 sekund.
Je možné definovat vlastní RetryStrategy s FirebaseJobDispatcher.NewRetryStrategy metodou. Používá tři parametry:
int policy–int policyje jednou z předchozíchRetryStrategyhodnot,RetryStrategy.RetryPolicyLinearneboRetryStrategy.RetryPolicyExponential.int initialBackoffSeconds–int initialBackoffSecondsje zpoždění v sekundách, které je nutné před pokusem o spuštění úlohy znovu. Výchozí hodnota je 30 sekund.int maximumBackoffSeconds–int maximumBackoffSecondsdeklaruje maximální počet sekund do zpoždění, než se pokusíte znovu spustit úlohu. Výchozí hodnota je 3600 sekund.
RetryStrategy retry = dispatcher.NewRetryStrategy(RetryStrategy.RetryPolicyLinear, initialBackoffSeconds, maximumBackoffSet);
// Create a Job and set the RetryStrategy via the Job.Builder
Job myJob = dispatcher.NewJobBuilder()
.SetService<DemoJob>("demo-job-tag")
.SetRetryStrategy(retry)
.Build();
Zrušení úlohy
Je možné zrušit všechny úlohy, které byly naplánovány, nebo pouze jednu úlohu pomocí FirebaseJobDispatcher.CancelAll() metody nebo FirebaseJobDispatcher.Cancel(string) metody:
int cancelResult = dispatcher.CancelAll();
// to cancel a single job:
int cancelResult = dispatcher.Cancel("unique-tag-for-job");
Kterákoli z metod vrátí celočíselnou hodnotu:
FirebaseJobDispatcher.CancelResultSuccess– Úloha se úspěšně zrušila.FirebaseJobDispatcher.CancelResultUnknownError– Chyba zabránila zrušení úlohy.FirebaseJobDispatcher.CancelResult.NoDriverAvailable–FirebaseJobDispatcherNemůže úlohu zrušit, protože neníIDriverk dispozici žádná platná.
Souhrn
Tato příručka popisuje, jak pomocí dispečera úloh Firebase inteligentně provádět práci na pozadí. Pojednává o tom, jak zapouzdřit práci, která se má provést jako JobService a jak použít FirebaseJobDispatcher k naplánování této práce, zadání kritérií s JobTrigger a způsob, jakým se mají chyby zpracovat RetryStrategy .