Firebase İş Dağıtıcı

Bu kılavuzda, Google 'ın Firebase Iş dağıtıcısı kitaplığı kullanılarak arka plan işinin nasıl zamanlandığı açıklanmaktadır.

Genel Bakış

Android uygulamasını kullanıcıya yanıt verecek şekilde tutmanın en iyi yöntemlerinden biri, karmaşık veya uzun süre çalışan çalışmanın arka planda gerçekleştirilmesini sağlamaktır. Ancak arka plan işinin, kullanıcının cihazla olan deneyimini olumsuz şekilde etkilememesi önemlidir.

Örneğin, bir arka plan işi belirli bir veri kümesindeki değişiklikleri sorgulamak için her üç veya dört dakikada bir Web sitesini yoklamayı gerektirebilir. Bu, zararsız gibi görünse de, pil ömrü üzerinde felaket bir etkiye sahip olabilir. Uygulama, arka arkaya cihazı uyandırır, CPU 'YU daha yüksek bir güç durumuna yükseltirse, radyoların gücünü kapatıp, ağ isteklerini yapıp sonuçları işleyerek sonuçları işleyecektir. Cihaz hemen kapanmayacağı ve düşük güç boşta durumuna döndürülmediği için bu daha kötüleşiyor. Kötü zamanlı zamanlanmış arka plan çalışması yanlışlıkla cihazı gereksiz ve aşırı güç gereksinimlerine sahip bir durumda tutar. Bu ımasum etkinliği (bir Web sitesini yoklamak), cihazı görece kısa bir süre içinde kullanılamaz hale getirecek.

Android, arka planda iş gerçekleştirmeye yardımcı olmak için aşağıdaki API 'Leri sağlar, ancak kendi kendilerine akıllı iş zamanlaması için yeterli değildir.

  • Amaç Hizmetleri – amaç gerçekleştirmek Için harika hizmetler, ancak iş zamanlamak için bir yol sağlar.
  • Alarmmanager : Bu API 'ler yalnızca çalışmanın zamanlanmasını sağlar ancak çalışmayı gerçekten gerçekleştirmek için bir yol sağlar. Ayrıca, AlarmManager yalnızca zamana dayalı kısıtlamalara izin verir. Bu, belirli bir süre içinde veya belirli bir süre geçtikten sonra alarm tetiklemedir.
  • Jobscheduler : JobSchedule, işleri zamanlamak için işletim sistemiyle birlikte çalışan harıka bir API 'dir. Ancak, yalnızca API düzeyi 21 veya üstünü hedefleyen Android uygulamaları için kullanılabilir.
  • Yayın alıcıları – bir Android uygulaması, sistem genelinde olaylara veya amaçlar için yanıt olarak iş gerçekleştirmek üzere yayın alıcılarını ayarlayabilir. Ancak, yayın alıcıları iş çalıştırılması gerektiğinde herhangi bir denetim sağlamaz. Ayrıca, Android işletim sistemindeki değişiklikler yayın alıcılarının ne zaman çalışabileceğini veya yanıt verebilecekleri iş türlerini kısıtlar.

Arka plan çalışmasını verimli bir şekilde gerçekleştirmek için iki temel özellik vardır (bazen bir arka plan işi veya olarak adlandırılır):

  1. İşi akıllıca zamanlamaya göre, bir uygulama arka planda çalışırken iyi bir vatandaşlık olarak yaptığı durumlarda önemlidir. İdeal olarak, uygulama bir işin çalıştırılacağını talep etmez. Bunun yerine, uygulama, iş çalışabileceği zaman için karşılanması gereken koşulları belirtmelidir ve sonra bu işi koşullar karşılandığında çalışacak şekilde zamanlar. Bu, Android 'in işi akıllıca gerçekleştirmesine olanak sağlar. Örneğin, ağ istekleri, ağ ile ilgili ek yükün en fazla kullanımını sağlamak için aynı anda tümünü çalıştıracak şekilde toplanmış olabilir.
  2. Işi kapsülleme : arka plan işini gerçekleştirmeye yönelik kod, kullanıcı arabiriminden bağımsız bir şekilde çalıştırılabilen ayrı bir bileşende kapsüllenmelidir ve bir nedenden dolayı iş tamamlanamazsa daha kolay bir şekilde yeniden zamanlayabilirsiniz.

Firebase Iş dağıtıcısı, bir Google tarafından arka plan işinin planlanmasını kolaylaştırmak için bir Fluent API sağlayan bir kitaplıktır. Google Cloud Manager 'ın yerini alacak şekilde tasarlanmıştır. Firebase Iş dağıtıcısı aşağıdaki API 'lerden oluşur:

  • , Firebase.JobDispatcher.JobService Arka plan işinde çalışacak mantığı ile genişletilmesi gereken soyut bir sınıftır.
  • Bir Firebase.JobDispatcher.JobTrigger iş ne zaman başlatılacağını bildirir. Bu genellikle bir zaman penceresi 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 bir şekilde yürütülemezse ne yapılmalı hakkında bilgiler içerir. Yeniden deneme stratejisi, işi yeniden çalıştırmayı denemeden önce ne kadar bekleneceğini belirtir.
  • , Firebase.JobDispatcher.Constraint Cihaz tarifeli olmayan bir ağda veya şarj durumunda olduğu gibi, işin çalıştırılabilmesi için karşılanması gereken bir koşulu açıklayan isteğe bağlı bir değerdir.
  • , Firebase.JobDispatcher.Job ' Deki önceki API 'leri, tarafından zamanlanabilen bir iş birimi ile birleştiren BIR API 'dir JobDispatcher . Job.BuilderSınıfı bir örneğini oluşturmak için kullanılır Job .
  • , Firebase.JobDispatcher.JobDispatcher İşletim sistemiyle çalışmayı zamanlamak ve gerekirse işleri iptal etmek için bir yol sağlamak üzere önceki üç API 'yi kullanır.

Firebase Iş dağıtıcısıyla iş zamanlamak için bir Xamarin. Android uygulaması, kodu sınıfını genişleten bir tür içinde kapsületmelidir JobService . JobService İşin ömrü boyunca çağrılabilecek üç yaşam döngüsü yöntemine sahiptir:

  • bool OnStartJob(IJobParameters parameters) – Bu yöntem, işin gerçekleştiği ve her zaman uygulanması gereken yerdir. Ana iş parçacığında çalışır. Bu yöntem true , kalan iş varsa veya false iş yapıldığında döndürülür.
  • bool OnStopJob(IJobParameters parameters) – Bu, iş bir nedenden dolayı durdurulduğunda çağrılır. trueİş daha sonra yeniden zamanlanırsa, döndürmelidir.
  • JobFinished(IJobParameters parameters, bool needsReschedule) – Bu yöntem, JobService zaman uyumsuz çalışmayı bitirdiğinde çağrılır.

Bir işi zamanlamak için uygulama bir nesne örneği oluşturur JobDispatcher . Daha sonra, bir Job.Builder nesnesi oluşturmak için kullanılır Job , bu, ' a sağlanacak JobDispatcher ve işi deneyecek ve zamanlamaya çalışacak.

Bu kılavuz, bir Xamarin. Android uygulamasına Firebase Iş dağıtıcısına nasıl ekleneceğini ve arka plan çalışmasını zamanlamak için nasıl kullanılacağını tartışacaktır.

Gereksinimler

Firebase Iş dağıtıcısı, Android API Düzey 9 veya üstünü gerektirir. Firebase Iş dağıtıcısı kitaplığı, Google Play Hizmetleri tarafından sunulan bazı bileşenlere dayanır; cihazda yüklü Google Play Hizmetleri olması gerekir.

Xamarin. Android içindeki Firebase Iş dağıtıcısı kitaplığını kullanma

firebase iş dağıtıcısına başlamak için önce xamarin. firebase. jobdispatcher NuGet paketini xamarin. Android projesine ekleyin. Xamarin. firebase. jobdispatcher paketi için NuGet Paket Yöneticisi arayın (hala yayın öncesi sürüm).

Firebase Iş dağıtıcısı kitaplığı ekledikten sonra bir JobService sınıf oluşturun ve sonra bir örneği ile çalışacak şekilde zamanlayın FirebaseJobDispatcher .

JobService oluşturma

Firebase Iş dağıtıcısı kitaplığı tarafından gerçekleştirilen tüm işler, soyut sınıfı genişleten bir tür içinde yapılmalıdır Firebase.JobDispatcher.JobService . Oluşturma JobServiceService , Android Framework ile oluşturmak için çok benzerdir:

  1. Sınıfı genişletme JobService
  2. Alt sınıfı ile süslemek ServiceAttribute . Kesinlikle gerekli olmasa da, Name parametresini hata ayıklamada yardımcı olacak şekilde açıkça ayarlamanız önerilir JobService .
  3. IntentFilterAndroidManifest.xmliçinde bildirmek için bir ekleyin JobService . IntentFilter Bu, Firebase Iş dağıtıcısı kitaplığı 'nın ' i bulmasını ve çağırabilmesini de yardımcı olur JobService .

Aşağıdaki kod, bir uygulamanın en basit örneğine bir örnektir ve bu, JobService zaman uyumsuz olarak bir iş yürütmek IÇIN tpl kullanarak:

[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 iş zamanlanmadan önce bir nesnesi oluşturmak gerekir Firebase.JobDispatcher.FirebaseJobDispatcher . , FirebaseJobDispatcher Zamanlamadan sorumludur JobService . Aşağıdaki kod parçacığı, bir örneği oluşturmanın bir yoludur FirebaseJobDispatcher :

// 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, GooglePlayDriverFirebaseJobDispatcher cihazda Google Play hizmetleri bazı zamanlama API 'leriyle etkileşime yardım eden sınıfı. Parametresi contextContext , etkinlik gibi herhangi bir Android. Şu anda GooglePlayDriverIDriver Firebase iş dağıtıcısı kitaplığındaki tek uygulama.

Firebase Iş dağıtıcısı için Xamarin. Android bağlaması, öğesinden bir oluşturmak için bir genişletme yöntemi sağlar FirebaseJobDispatcherContext :

FirebaseJobDispatcher dispatcher = context.CreateJobDispatcher();

Örneği oluşturulduktan sonra FirebaseJobDispatcher , oluşturmak Job ve kodu sınıfında çalıştırmak mümkündür JobService . , Job Bir nesnesi tarafından oluşturulur Job.Builder ve sonraki bölümde ele alınacaktır.

Iş. Oluşturucu ile Firebase. JobDispatcher. job oluşturma

Firebase.JobDispatcher.JobSınıfı, çalıştırmak için gereken meta verileri kapsüllenmekten sorumludur JobService . , Job İş çalıştırılmadan önce karşılanması gereken herhangi bir kısıtlama, Eğer Job yinelense veya işin çalışmasına neden olacak tetikleyiciler gibi bilgileri içerir. En azından, bir JobJob (işi tanımlayan benzersiz bir dize FirebaseJobDispatcher ) ve çalıştırılması gereken öğesinin türüne sahip olması gerekir JobService . Firebase Iş dağıtıcısı JobService işi çalıştırmak için zaman olduğunda onu örneklendirilecek. , Job Sınıfının bir örneği kullanılarak oluşturulur Firebase.JobDispatcher.Job.JobBuilder .

Aşağıdaki kod parçacığı, Job Xamarin. Android bağlamasını kullanarak oluşturma hakkında en basit örnektir:

Job myJob = dispatcher.NewJobBuilder()
                      .SetService<DemoJob>("demo-job-tag")
                      .Build();

, Job.Builder İş için giriş değerlerinde bazı temel doğrulama denetimleri gerçekleştirir. İçin bir özel durum oluşturulması mümkün değilse, bir özel durum oluşturulur Job.BuilderJob . , Job.BuilderJob Aşağıdaki varsayılanlarla bir oluşturur:

  • Bir JobJob (ne kadar süreyle çalıştırılmak üzere zamanlanacaktır), cihaz yeniden başlatıldıktan sonra, cihaz yeniden başlatıldıktan sonra Job kaybedilir.
  • Bir Job yinelenen değil; yalnızca bir kez çalışır.
  • Bir Job , mümkün olan en kısa sürede çalışacak şekilde zamanlanır.
  • Bir için varsayılan yeniden deneme stratejisi, bir JobJob alma işlemi kullanmaktır (bir retrystrateji ayarlamabölümünde aşağıda daha ayrıntılı bir şekilde ele alınmıştır)

İş zamanlama

Oluşturduktan sonra, Job çalıştırılmadan önce ile zamanlanması gerekir FirebaseJobDispatcher . Zamanlamak için iki yöntem vardır 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);

Tarafından döndürülen değer FirebaseJobDispatcher.Schedule aşağıdaki tamsayı değerlerinden biri olacaktır:

  • FirebaseJobDispatcher.ScheduleResultSuccessJob Başarıyla zamanlandı.
  • FirebaseJobDispatcher.ScheduleResultUnknownError – Bazı bilinmeyen bir sorun oluştu ve bunun Job zamanlanmasını engelledi.
  • FirebaseJobDispatcher.ScheduleResultNoDriverAvailable – Geçersiz bir IDriver kullanıldı veya bir şekilde IDriver kullanılamıyor.
  • FirebaseJobDispatcher.ScheduleResultUnsupportedTriggerTrigger Desteklenmez.
  • FirebaseJobDispatcher.ScheduleResultBadService – Hizmet doğru yapılandırılmamış veya kullanılamıyor.

İş yapılandırma

Bir işi özelleştirmek mümkündür. Bir işin nasıl özelleştirebileceğinize örnek olarak şunlar dahildir:

  • Bir İşe Parametre Geçirme – A, işini gerçekleştirmek için ek değerler (örneğin, bir dosya indirme) gerektirir.
  • Kısıtlamaları Ayarla – Yalnızca belirli koşullar karşı olduğunda bir işin çalışması gerekebilir. Örneğin, yalnızca cihaz Job ücretlendirmesi olduğunda bir çalıştırın.
  • Ne zaman çalıştıracaklarını belirtin – Firebase Job Dispatcher, uygulamaların işin ne zaman çalıştıracaklarını belirtmelerini sağlar.
  • Başarısız işler için yeniden deneme stratejisi bildir – Yeniden deneme stratejisi, bu başarısızlığa karşı nelerin tamamlanamadıkları konusunda rehberlik sağlar.

Bu konuların her biri aşağıdaki bölümlerde daha fazla ele alınmıştır.

Bir işe parametre geçirme

Parametreler, yöntemiyle birlikte geçirilen Bundle bir oluşturarak bir işe Job.Builder.SetExtras geçirildi:

Bundle jobParameters = new Bundle();
jobParameters.PutInt(FibonacciCalculatorJob.FibonacciPositionKey, 25);

Job myJob = dispatcher.NewJobBuilder()
                      .SetService<DemoJob>("demo-job-tag")
                      .SetExtras(jobParameters)
                      .Build();

Bundleyönteminde IJobParameters.Extras özelliğinden OnStartJob 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, cihaz maliyetlerini azaltmaya veya pil boşaltmaya yardımcı olabilir. sınıfı Firebase.JobDispatcher.Constraint bu kısıtlamaları tamsayı değerleri olarak tanımlar:

  • Constraint.OnUnmeteredNetwork – Yalnızca cihaz bir ölçersiz ağa bağlıyken işi çalıştırın. Bu, kullanıcının veri ücretlerini ödemesini önlemek için yararlıdır.
  • Constraint.OnAnyNetwork – Cihazın bağlı olduğu ağ üzerinde işi çalıştırın. ile birlikte Constraint.OnUnmeteredNetwork belirtilirse, bu değer öncelik alır.
  • Constraint.DeviceCharging – Yalnızca cihaz ücretlendirmesi olduğunda işi ç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. , JobTrigger çalışma zamanı JobTrigger zamanlanmış bir saat tanımlayan bir yürütme Job penceresine sahip. 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 bekleyeceği saniye sayısıdır ve bitiş penceresi değeri, çalıştırmadan önce bekleyeceği en fazla saniye Job sayısıdır.

JobTriggerbir yöntemiyle Firebase.Jobdispatcher.Trigger.ExecutionWindow oluşturulabilir. Örneğin, Trigger.ExecutionWindow(15,60) işin zamanlandığı zamandan itibaren 15 ile 60 saniye arasında çalışması gerektiği anlamına gelir. Job.Builder.SetTriggeryöntemi,

JobTrigger myTrigger = Trigger.ExecutionWindow(15,60);
Job myJob = dispatcher.NewJobBuilder()
                      .SetService<DemoJob>("demo-job-tag")
                      .SetTrigger(myTrigger)
                      .Build();

Bir işin varsayılan değeri, bir işin zamanlandıktan sonra mümkün olan en kısa sürede JobTriggerTrigger.Now çalıştırılmalıdır.

RetryStrategy Ayarlama

, başarısız bir işi yeniden çalıştırmaya çalışmadan önce cihazın ne Firebase.JobDispatcher.RetryStrategy kadar gecikme süresi kullan gerektiğini belirtmek için kullanılır. , başarısız işi yeniden zamanlaması için kullanılacak zaman tabanı algoritmasını tanımlayan bir ilkesine ve işin zamanlandığı bir pencereyi belirten yürütme RetryStrategy penceresine sahip. RetryStrategy Bu yeniden zamanlama penceresi iki değerle tanımlanır. İlk değer, işi yeniden planlamadan önce bekleyeceğiniz saniye sayısıdır (ilk geri dönme değeri) ve ikinci sayı işin çalışması gerekmeden önce en fazla saniye sayısıdır (maksimum geri dönme değeri).

yeniden deneme ilkelerinin iki türü şu int değerleriyle tanımlanır:

  • RetryStrategy.RetryPolicyExponentialRetryStrategy.RetryPolicyExponential her hatadan sonra ilk geri tarak değerini üstel olarak artıracaktır. Bir iş ilk kez başarısız olduğunda, kitaplık işi yeniden _initial önce belirtilen zaman 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 edin. RetryStrategyFirebase Job Dispatcher kitaplığı için varsayılan değer nesnesiyle RetryStrategy.DefaultExponential temsil edilir. İlk geri 30 saniye ve maksimum geri de 3600 saniyedir.
  • RetryStrategy.RetryPolicyLinear – Bu strateji, RetryStrategy.RetryPolicyLinear (başarılı olana kadar) çalışması için yeniden zamanlandı olması gereken doğrusal bir geri taraktır. Doğrusal geri çıkarma, mümkün olan en kısa sürede tamamlanması gereken işler veya kendilerini hızla çözecek sorunlar için en uygun olandır. Firebase Job Dispatcher kitaplığı, en az 30 saniye ve en fazla 3600 saniyelik yeniden zamanlama penceresi olan RetryStrategy.DefaultLinear bir tanımlar.

yöntemiyle bir özel RetryStrategy tanımlamak FirebaseJobDispatcher.NewRetryStrategy mümkündür. Üç parametre alır:

  1. int policyint policy veya gibi RetryStrategy önceki RetryStrategy.RetryPolicyLinear değerlerden RetryStrategy.RetryPolicyExponential biri.
  2. int initialBackoffSecondsint initialBackoffSeconds işi yeniden çalıştırmaya çalışmadan önce gereken bir gecikmedir (saniye olarak). Bunun varsayılan değeri 30 saniyedir.
  3. int maximumBackoffSeconds – En int maximumBackoffSeconds değeri, işi yeniden çalıştırmaya çalışmadan önce geciktirmek için en fazla saniye sayısını bildirer. 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 ediyor

Zamanlanmış tüm işleri veya yöntemini kullanarak yalnızca tek bir işi FirebaseJobDispatcher.CancelAll() iptal etmek FirebaseJobDispatcher.Cancel(string) mümkündür:

int cancelResult = dispatcher.CancelAll(); 

// to cancel a single job:

int cancelResult = dispatcher.Cancel("unique-tag-for-job");

İki yöntemden biri bir tamsayı değeri döndürür:

  • FirebaseJobDispatcher.CancelResultSuccess – İş başarıyla iptal edildi.
  • FirebaseJobDispatcher.CancelResultUnknownError – Hata, işin iptal edimsini önledi.
  • FirebaseJobDispatcher.CancelResult.NoDriverAvailableFirebaseJobDispatcher Geçerli bir kullanılabilirlik mevcut olduğundan işi iptal IDriver etmek mümkün değildir.

Özet

Bu kılavuzda Firebase Job Dispatcher'ın arka planda akıllı bir şekilde çalışma yapmak için nasıl kullanılası tartışılmıştır. Bir olarak gerçekleştirilecek işi kapsülleme ve ile ölçütleri belirterek bu işi zamanlamayı kullanmak ve hataların ile nasıl ele alın gerektiğini ele JobServiceFirebaseJobDispatcherJobTriggerRetryStrategy aldı.