Firebase İş Dağıtıcı
Bu kılavuzda, Google'dan Firebase job dispatcher kitaplığını kullanarak arka plan çalışmasının nasıl zamanlandığı açıklanır.
Genel bakış
Android uygulamasını kullanıcıya duyarlı tutmanın en iyi yollarından biri, karmaşık veya uzun süre çalışan işlerin arka planda gerçekleştirilmesini sağlamaktır. Ancak, arka plan çalışmalarının kullanıcının cihazdaki deneyimini olumsuz etkilememesi önemlidir.
Örneğin arka plan işi, belirli bir veri kümesindeki değişiklikleri sorgulamak için her üç veya dört dakikada bir bir web sitesini yoklayabilir. Bu iyi huylu görünüyor, ancak pil ömrü üzerinde felaket bir etkiye sahip olabilir. Uygulama cihazı tekrar tekrar uyandırır, CPU'yu daha yüksek bir güç durumuna yükseltecek, radyoları güçlendirecek, ağ isteklerini yapacak ve ardından sonuçları işleyecek. Cihaz hemen kapanmayacağından ve düşük güçte boşta kalma durumuna geri dönmeyeceği için durum daha da kötüleşir. Kötü zamanlanmış arka plan çalışması, cihazı yanlışlıkla gereksiz ve aşırı güç gereksinimleri olan bir durumda tutabilir. Bu görünüşte masum bir etkinlik (bir web sitesini yoklama), cihazı nispeten kısa bir süre içinde kullanılamaz hale getirir.
Android, arka planda iş gerçekleştirmeye yardımcı olmak için aşağıdaki API'leri sağlar, ancak kendi başlarına akıllı iş zamanlama için yeterli değildir.
- Intent Services – Intent Services, işi gerçekleştirmek için mükemmeldir, ancak çalışmayı zamanlamanın hiçbir yolunu sağlamaz.
- AlarmManager – Bu API'ler yalnızca işin zamanlamasına izin verir, ancak çalışmayı gerçekleştirmek için hiçbir yol sağlamaz. Ayrıca, AlarmManager yalnızca zamana bağlı kısıtlamalara izin verir, yani belirli bir zamanda veya belirli bir süre geçtikten sonra alarm tetikler.
- JobScheduler – JobSchedule, işleri zamanlamak için işletim sistemiyle birlikte çalışan harika bir API'dir. Ancak yalnızca API düzeyi 21 veya üzerini hedefleyen Android uygulamaları için kullanılabilir.
- Yayın Alıcıları – Android uygulaması, sistem genelindeki olaylara veya Amaçlara yanıt olarak iş gerçekleştirmek için yayın alıcılarını ayarlayabilir. Ancak, yayın alıcıları işin ne zaman çalıştırılacağı üzerinde herhangi bir denetim sağlamaz. Ayrıca Android işletim sistemindeki değişiklikler, yayın alıcılarının ne zaman çalışacağını veya yanıt verebilecekleri iş türlerini kısıtlar.
Arka plan çalışmalarını verimli bir şekilde gerçekleştirmek için iki önemli özellik vardır (bazen arka plan işi veya iş olarak da adlandırılır):
- İşi akıllı bir şekilde zamanlama – Bir uygulama arka planda çalışırken bunu iyi bir vatandaş olarak yapması önemlidir. İdeal olan, uygulamanın bir işin çalıştırılmasını istememesidir. Bunun yerine, uygulamanın işin ne zaman çalışabileceğine ilişkin karşılanması gereken koşulları belirtmesi ve ardından koşullar karşılandığında çalışacak şekilde zamanlaması gerekir. Bu, Android'in akıllı bir şekilde iş gerçekleştirmesini sağlar. Örneğin ağ istekleri, ağ ile ilgili ek yüklerden en yüksek düzeyde yararlanmak için tümünü aynı anda çalıştıracak şekilde toplu işlenebilir.
- Çalışmayı kapsülleme – Arka plan çalışmasını gerçekleştirme kodu, kullanıcı arabiriminden bağımsız olarak çalıştırılabilen ayrık bir bileşende kapsüllenmelidir ve çalışmanın bir nedenle tamamlanamaması durumunda yeniden zamanlanması nispeten kolay olacaktır.
Firebase İş Dağıtıcısı, arka plan çalışmasının zamanlamasını basitleştirmek için akıcı bir API sağlayan Google kitaplığıdır. Google Cloud Manager'ın yerini alması amaçlanmıştır. Firebase İş Dağıtıcısı aşağıdaki API'lerden oluşur:
- A
Firebase.JobDispatcher.JobService
, arka plan işinde çalıştırılacak mantıkla genişletilmesi gereken soyut bir sınıftır. - ,
Firebase.JobDispatcher.JobTrigger
işin ne zaman başlatılması gerektiğini bildirir. Bu genellikle bir zaman aralığı olarak ifade edilir; örneğin, işi başlatmadan önce en az 30 saniye bekleyin, ancak işi 5 dakika içinde çalıştırın. - bir
Firebase.JobDispatcher.RetryStrategy
iş düzgün yürütülemediğinde yapılması gerekenler hakkında bilgi içerir. Yeniden deneme stratejisi, işi yeniden çalıştırmayı denemeden önce ne kadar bek süreceğini belirtir. - ,
Firebase.JobDispatcher.Constraint
iş çalıştırılmadan önce karşılanması gereken bir koşulu açıklayan isteğe bağlı bir değerdir( örneğin, cihaz ölçülmemiş bir ağda veya şarjdadır). - ,
Firebase.JobDispatcher.Job
içindeki önceki API'leri tarafından zamanlanabilir bir iş birimiyle birleştiren bir API'dirJobDispatcher
.Job.Builder
sınıfı bir örneğiJob
oluşturmak için kullanılır. - A
Firebase.JobDispatcher.JobDispatcher
, işletim sistemiyle çalışmayı zamanlamak ve gerekirse işleri iptal etmek için bir yol sağlamak için önceki üç API'yi kullanır.
Firebase İş Dağıtıcısı ile çalışmayı zamanlamak için, Xamarin.Android uygulaması sınıfını genişleten JobService
bir türdeki kodu kapsüllemelidir. JobService
işin ömrü boyunca çağrılabilecek üç yaşam döngüsü yöntemi vardır:
bool OnStartJob(IJobParameters parameters)
– Bu yöntem, işin gerçekleşeceği ve her zaman uygulanması gereken yerdir. Ana iş parçacığında çalışır. Kalan iş varsa veyafalse
iş yapıldıysa bu yöntem döndürülecektirtrue
.bool OnStopJob(IJobParameters parameters)
– İş bir nedenle durdurulduğunda bu çağrılır. İşin daha sonra için yeniden zamanlanması gerekiyorsa döndürülmelidirtrue
.JobFinished(IJobParameters parameters, bool needsReschedule)
– Bu yöntem, herhangi bir zaman uyumsuz çalışmayı bitirdiğindeJobService
çağrılır.
Bir işi zamanlamak için uygulama bir JobDispatcher
nesne örneği oluşturur. Ardından, Job.Builder
öğesinin çalıştırılacak işi deneyip zamanlayacak şekilde sağlandığı JobDispatcher
bir Job
nesnesi oluşturmak için kullanılır.
Bu kılavuzda Firebase İş Dağıtıcısı'nın bir Xamarin.Android uygulamasına nasıl ekleneceği ve arka plan çalışması zamanlamak için nasıl kullanılacağı açıklanır.
Gereksinimler
Firebase İş Dağıtıcısı, Android API düzeyi 9 veya üzerini gerektirir. Firebase job dispatcher kitaplığı, Google Play Services tarafından sağlanan bazı bileşenlere dayanır; cihazda Google Play Services yüklü olmalıdır.
Xamarin.Android'de Firebase İş Dağıtıcı Kitaplığını Kullanma
Firebase İş Dağıtıcısı'nı kullanmaya başlamak için önce Xamarin.Firebase.JobDispatcher NuGet paketini Xamarin.Android projesine ekleyin. NuGet Paket Yöneticisi Xamarin.Firebase.JobDispatcher paketini (hala yayın öncesi sürümdedir) arayın.
Firebase job dispatcher kitaplığını ekledikten sonra bir JobService
sınıf oluşturun ve bunu öğesinin FirebaseJobDispatcher
bir örneğiyle çalışacak şekilde zamanlayın.
JobService Oluşturma
Firebase İş Dağıtıcısı kitaplığı tarafından gerçekleştirilen tüm çalışmalar soyut sınıfını genişleten Firebase.JobDispatcher.JobService
bir türde yapılmalıdır. JobService
Oluşturma işlemi, Android çerçevesiyle oluşturma Service
işlemine çok benzer:
- Sınıfını
JobService
genişletme - Alt sınıfı ile süsleyin
ServiceAttribute
. Tam olarak gerekli olmasa da, hata ayıklamayaJobService
yardımcı olması için parametresininName
açıkça ayarlanması önerilir. - AndroidManifest.xml bildirmek
JobService
için birIntentFilter
ekleyin. Bu, Firebase İş Dağıtıcısı kitaplığının öğesini bulmasına ve çağırmasınıJobService
da sağlar.
Aşağıdaki kod, bazı işleri zaman uyumsuz olarak gerçekleştirmek için TPL kullanan bir uygulama için en JobService
basit örnektir:
[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;
}
}
FirebaseJobDispatcher Oluşturma
Herhangi bir çalışmanın zamanlanması için önce bir Firebase.JobDispatcher.FirebaseJobDispatcher
nesne oluşturulması gerekir. FirebaseJobDispatcher
, zamanlanmasından JobService
sorumludur. Aşağıdaki kod parçacığı, örneğini oluşturmanın FirebaseJobDispatcher
bir yoludur:
// This is the "Java" way to create a FirebaseJobDispatcher object
IDriver driver = new GooglePlayDriver(context);
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(driver);
Önceki kod parçacığında, GooglePlayDriver
cihazdaki Google Play Hizmetleri'ndeki FirebaseJobDispatcher
zamanlama API'lerinden bazılarıyla etkileşime yardımcı olan sınıfıdır. parametresi context
, Etkinlik gibi herhangi bir Android'dir Context
. GooglePlayDriver
Şu anda Firebase İş Dağıtıcısı kitaplığındaki tek IDriver
uygulamadır.
Firebase İş Dağıtıcısı için Xamarin.Android bağlaması, içinden Context
oluşturmak için bir FirebaseJobDispatcher
uzantı yöntemi sağlar:
FirebaseJobDispatcher dispatcher = context.CreateJobDispatcher();
FirebaseJobDispatcher
örneği oluşturulduktan sonra sınıfında bir Job
oluşturup kodu JobService
çalıştırmak mümkündür. Job
bir Job.Builder
nesne tarafından oluşturulur ve sonraki bölümde ele alınacaktır.
Job.Builder ile Firebase.JobDispatcher.Job Oluşturma
Firebase.JobDispatcher.Job
sınıfı, bir JobService
çalıştırmak için gereken meta verileri kapsüllemeden sorumludur. ,Job
iş çalıştırılmadan önce karşılanması gereken herhangi bir kısıtlama, yinelenense Job
veya işin çalıştırılmasına neden olacak tetikleyiciler gibi bilgileri içerir. En düşük değer olarak, bir Job
etiketi (işi FirebaseJobDispatcher
olarak tanımlayan benzersiz bir dize) ve çalıştırılması gereken türünün JobService
olması gerekir . Firebase İş Dağıtıcısı, işi çalıştırma zamanı geldiğinde öğesinin örneğini JobService
oluşturur. sınıfının Job
bir örneği Firebase.JobDispatcher.Job.JobBuilder
kullanılarak oluşturulur.
Aşağıdaki kod parçacığı, Xamarin.Android bağlamasını kullanarak oluşturmanın Job
en basit örneğidir:
Job myJob = dispatcher.NewJobBuilder()
.SetService<DemoJob>("demo-job-tag")
.Build();
, Job.Builder
işin giriş değerleri üzerinde bazı temel doğrulama denetimleri gerçekleştirir. öğesinin oluşturması mümkün Job.Builder
değilse bir Job
özel durum oluşturulur. aşağıdaki Job.Builder
varsayılan değerlerle bir Job
oluşturur:
- Bir
Job
'nin yaşam süresi (çalışmak için ne kadar zamanlanacağı) yalnızca cihaz yeniden başlatılana kadar (cihaz yeniden başlatıldıktanJob
sonra) kaybolur. - A
Job
yinelenen değil; yalnızca bir kez çalışır. - bir
Job
en kısa sürede çalışacak şekilde zamanlanır. - için
Job
varsayılan yeniden deneme stratejisi üstel geri alma kullanmaktır (Aşağıda RetryStrategy Ayarlama bölümünde daha ayrıntılı olarak açıklanmıştır)
İşi zamanlama
oluşturulduktan Job
sonra, çalıştırılmadan önce ile FirebaseJobDispatcher
zamanlanması gerekir. Zamanlamak Job
için iki yöntem vardır:
// 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);
tarafından FirebaseJobDispatcher.Schedule
döndürülen değer aşağıdaki tamsayı değerlerinden biri olacaktır:
FirebaseJobDispatcher.ScheduleResultSuccess
Job
– başarıyla zamanlandı.FirebaseJobDispatcher.ScheduleResultUnknownError
– Zamanlanmasını engelleyenJob
bilinmeyen bir sorun oluştu.FirebaseJobDispatcher.ScheduleResultNoDriverAvailable
– GeçersizIDriver
bir kullanıldı veyaIDriver
bir şekilde kullanılamıyordu.FirebaseJobDispatcher.ScheduleResultUnsupportedTrigger
– desteklenmediTrigger
.FirebaseJobDispatcher.ScheduleResultBadService
– Hizmet doğru yapılandırılmamış veya kullanılamıyor.
İşi yapılandırma
bir işi özelleştirmek mümkündür. bir işin nasıl özelleştirilebileceğini gösteren örnekler şunlardır:
- Parametreleri Bir İşe Geçirme – A
Job
, çalışmasını gerçekleştirmek için ek değerler gerektirebilir, örneğin bir dosyayı indirme. - Kısıtlamaları Ayarla – Bir işi yalnızca belirli koşullar karşılandığında çalıştırmak gerekebilir. Örneğin, yalnızca cihaz şarj olurken bir
Job
çalıştırın. - Bir
Job
öğesinin ne zaman çalıştırılacağını belirtin: Firebase İş Dağıtıcısı, uygulamaların işin çalıştırılması gereken zamanı belirtmesine izin verir. - Başarısız işler için yeniden deneme stratejisi bildirme – Yeniden deneme stratejisi, tamamlanmayan işlerle
Jobs
ilgili yönergeler sağlarFirebaseJobDispatcher
.
Bu konuların her biri aşağıdaki bölümlerde daha fazla ele alınacaktır.
Parametreleri bir işe geçirme
Parametreler, yöntemiyle Job.Builder.SetExtras
birlikte geçirilen bir Bundle
oluşturularak bir işe geçirilir:
Bundle jobParameters = new Bundle();
jobParameters.PutInt(FibonacciCalculatorJob.FibonacciPositionKey, 25);
Job myJob = dispatcher.NewJobBuilder()
.SetService<DemoJob>("demo-job-tag")
.SetExtras(jobParameters)
.Build();
Bundle
yöntemindeki IJobParameters.Extras
OnStartJob
özelliğinden erişilir:
public override bool OnStartJob(IJobParameters jobParameters)
{
int position = jobParameters.Extras.GetInt(FibonacciPositionKey, DEFAULT_VALUE);
// rest of code omitted
}
Kısıtlamaları ayarlama
Kısıtlamalar, cihazdaki maliyetleri veya pil tüketimini azaltmaya yardımcı olabilir. Firebase.JobDispatcher.Constraint
sınıfı bu kısıtlamaları tamsayı değerleri olarak tanımlar:
Constraint.OnUnmeteredNetwork
– İşi yalnızca cihaz ölçülmemiş bir ağa bağlıyken çalıştırın. Bu, kullanıcının veri ücretleri ödemesini önlemek için yararlıdır.Constraint.OnAnyNetwork
– İşi cihazın bağlı olduğu ağ üzerinde çalıştırın. ileConstraint.OnUnmeteredNetwork
birlikte belirtilirse, bu değer öncelik alır.Constraint.DeviceCharging
– İşi yalnızca cihaz şarj olurken çalıştırın.
Kısıtlamalar yöntemiyle Job.Builder.SetConstraint
ayarlanır:
Job myJob = dispatcher.NewJobBuilder()
.SetService<DemoJob>("demo-job-tag")
.SetConstraint(Constraint.DeviceCharging)
.Build();
, JobTrigger
işletim sistemine işin ne zaman başlaması gerektiği hakkında rehberlik sağlar. A'nınJobTrigger
, çalışma zamanı için Job
zamanlanmış zamanı tanımlayan bir yürütme penceresi vardır. Yürütme penceresinin başlangıç penceresi değeri ve bitiş penceresi değeri vardır. Başlangıç penceresi, cihazın işi çalıştırmadan önce beklemesi gereken saniye sayısıdır ve bitiş penceresi değeri, çalıştırmadan Job
önce beklenmesi gereken en fazla saniye sayısıdır.
JobTrigger
yöntemiyle Firebase.Jobdispatcher.Trigger.ExecutionWindow
oluşturulabilir. Örneğin Trigger.ExecutionWindow(15,60)
, işin zamanlandığından itibaren 15 ile 60 saniye arasında çalışması gerektiği anlamına gelir. Job.Builder.SetTrigger
yöntemi,
JobTrigger myTrigger = Trigger.ExecutionWindow(15,60);
Job myJob = dispatcher.NewJobBuilder()
.SetService<DemoJob>("demo-job-tag")
.SetTrigger(myTrigger)
.Build();
Bir işin varsayılan JobTrigger
değeri, bir işin zamanlandıktan sonra en kısa sürede çalıştırıldığını belirten değeriyle Trigger.Now
temsil edilir..
RetryStrategy Ayarlama
Firebase.JobDispatcher.RetryStrategy
, başarısız bir işi yeniden çalıştırmaya çalışmadan önce bir cihazın ne kadar gecikme süresi kullanması gerektiğini belirtmek için kullanılır. , RetryStrategy
başarısız işi yeniden zamanlamak için hangi zaman tabanı algoritmasının kullanılacağını tanımlayan bir ilkeye ve işin zamanlanması gereken bir pencere belirten bir yürütme penceresine sahiptir. Bu yeniden zamanlama penceresi iki değerle tanımlanır. İlk değer, işi yeniden zamanlamadan önce beklenmesi gereken saniye sayısıdır ( ilk geri alma değeri) ve ikinci sayı işin çalışması gereken en fazla saniye sayısıdır ( en yüksek geri alma değeri).
İki tür yeniden deneme ilkesi şu int değerleriyle tanımlanır:
RetryStrategy.RetryPolicyExponential
– Üstel geri alma ilkesi, her hatadan sonra ilk geri alma değerini üstel olarak artırır. bir iş ilk kez başarısız olduğunda, kitaplık işi yeniden zamanlamadan önce belirtilen _initial aralığını (örneğin 30 saniye) bekler. İş ikinci kez başarısız olduğunda, kitaplık işi çalıştırmaya çalışmadan önce en az 60 saniye bekler. Üçüncü başarısız denemeden sonra kitaplık 120 saniye bekler ve bu şekilde devam eder. Firebase İş Dağıtıcısı kitaplığı için varsayılanRetryStrategy
değer nesnesiyleRetryStrategy.DefaultExponential
temsil edilir. İlk geri alma 30 saniye ve maksimum geri alma 3600 saniyedir.RetryStrategy.RetryPolicyLinear
– Bu strateji, işin belirlenen aralıklarla (başarılı olana kadar) çalışacak şekilde yeniden zamanlanması gereken doğrusal bir geri almadır . Doğrusal geri alma, mümkün olan en kısa sürede tamamlanması gereken çalışmalar veya kendilerini hızlı bir şekilde çözecek sorunlar için uygundur. Firebase job dispatcher kitaplığı, en az 30 saniyelik ve 3600 saniyeye kadar yeniden zamanlanan bir penceresi olan birRetryStrategy.DefaultLinear
öğesini tanımlar.
yöntemiyle FirebaseJobDispatcher.NewRetryStrategy
bir özel RetryStrategy
tanımlamak mümkündür. Üç parametre alır:
int policy
– İlke, veya öncekiRetryStrategy
değerlerdenRetryStrategy.RetryPolicyLinear
RetryStrategy.RetryPolicyExponential
biridir.int initialBackoffSeconds
– İlk geri alma işlemi, işi yeniden çalıştırmaya çalışmadan önce gereken saniyeler içinde bir gecikmedir. Bunun varsayılan değeri 30 saniyedir.int maximumBackoffSeconds
– Maksimum geri alma değeri, işi yeniden çalıştırmaya çalışmadan önce geciktirmek için en fazla saniye sayısını bildirir. Varsayılan değer 3600 saniyedir.
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();
bir işi iptal etme
Yöntemini veya yöntemini FirebaseJobDispatcher.Cancel(string)
kullanarak FirebaseJobDispatcher.CancelAll()
zamanlanmış tüm işleri veya yalnızca tek bir işi iptal etmek mümkündür:
int cancelResult = dispatcher.CancelAll();
// to cancel a single job:
int cancelResult = dispatcher.Cancel("unique-tag-for-job");
Her iki yöntem de bir tamsayı değeri döndürür:
FirebaseJobDispatcher.CancelResultSuccess
– İş başarıyla iptal edildi.FirebaseJobDispatcher.CancelResultUnknownError
– Hata, işin iptal edilmesini engelledi.FirebaseJobDispatcher.CancelResult.NoDriverAvailable
FirebaseJobDispatcher
– Geçerli bir kullanılabilirlikIDriver
olmadığından işi iptal edemiyor.
Özet
Bu kılavuzda, arka planda işi akıllı bir şekilde gerçekleştirmek için Firebase İş Dağıtıcısı'nın nasıl kullanılacağı açıklanmıştır. Bu makalede, bir olarak JobService
gerçekleştirilecek işin nasıl kapsülleneceğini ve öğesinin bu çalışmayı zamanlamak için nasıl kullanılacağı FirebaseJobDispatcher
, ölçütün bir JobTrigger
ile birlikte belirtilmesi ve hataların bir RetryStrategy
ile nasıl işlenmesi gerektiği anlatıldı.