Aracılığıyla paylaş


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 olarak da adlandırılır):

  1. İş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.
  2. Ç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'dir JobDispatcher. Job.Builder sınıfı bir örneği Joboluş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 veya false 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ülmelidir true .
  • JobFinished(IJobParameters parameters, bool needsReschedule) – Bu yöntem, herhangi bir zaman uyumsuz çalışmayı bitirdiğinde JobService ç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 FirebaseJobDispatcherbir ö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:

  1. Sınıfını JobService genişletme
  2. Alt sınıfı ile süsleyin ServiceAttribute. Tam olarak gerekli olmasa da, hata ayıklamaya JobServiceyardımcı olması için parametresinin Name açıkça ayarlanması önerilir.
  3. AndroidManifest.xml bildirmek JobServiceiçin bir IntentFilter ekleyin. Bu, Firebase İş Dağıtıcısı kitaplığının öğesini bulmasına ve çağırmasını JobServiceda 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 JobServicesorumludur. Aşağıdaki kod parçacığı, örneğini oluşturmanın FirebaseJobDispatcherbir 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 Contextoluş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 FirebaseJobDispatcherolarak 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ıktan Job 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 Jobsonra, çalıştırılmadan önce ile FirebaseJobDispatcher zamanlanması gerekir. Zamanlamak Jobiç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.ScheduleResultSuccessJob– başarıyla zamanlandı.
  • FirebaseJobDispatcher.ScheduleResultUnknownError – Zamanlanmasını engelleyen Job bilinmeyen bir sorun oluştu.
  • FirebaseJobDispatcher.ScheduleResultNoDriverAvailable – Geçersiz IDriver bir kullanıldı veya IDriver bir şekilde kullanılamıyordu.
  • FirebaseJobDispatcher.ScheduleResultUnsupportedTrigger – desteklenmedi Trigger .
  • 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.ExtrasOnStartJob ö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. ile Constraint.OnUnmeteredNetworkbirlikte 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.Nowtemsil 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ılan RetryStrategy değer nesnesiyle RetryStrategy.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 bir RetryStrategy.DefaultLinear öğesini tanımlar.

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

  1. int policy– İlke, veya önceki RetryStrategy değerlerden RetryStrategy.RetryPolicyLinearRetryStrategy.RetryPolicyExponentialbiridir.
  2. 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.
  3. 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.NoDriverAvailableFirebaseJobDispatcher– Geçerli bir kullanılabilirlik IDriver 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 RetryStrategyile nasıl işlenmesi gerektiği anlatıldı.