Android: AsyncTask ve Hizmet


138

Neden burada çoğu soru AsyncTaskve Yükleyiciler hakkında çok şey okudum ama Hizmetler hakkında hiçbir şey okumuyorum ? Hizmetler çok iyi bilinmiyor mu, yoksa kullanımdan kaldırılmış mı, bazı kötü nitelikleri mi var? Farklılıklar nedir?

(Bu arada, bu konuda başka iş parçacıkları olduğunu biliyorum, ancak hiçbiri bir geliştiricinin gerçek bir sorun için birini veya diğerini kullanarak daha iyi olup olmadığına kolayca karar vermesine yardımcı olan net farklılıkları belirtmiyor.)

Yanıtlar:


272

Bazı durumlarda, aynı görevi bir AsyncTaskveya biriyle gerçekleştirmek mümkündür, Serviceancak genellikle bir görev diğerine göre daha uygundur.

AsyncTasks, UI iş parçacığında çalıştırılamayan bir kerelik zaman alan görevler için tasarlanmıştır. Yaygın bir örnek, bir düğmeye basıldığında veri alınıyor / işleniyor.

Services arka planda sürekli olarak çalışacak şekilde tasarlanmıştır. Bir düğmeye basıldığında veri getirme yukarıdaki örnekte, bir hizmeti başlatabilir, verileri getirmesine izin verebilir ve sonra durdurabilirsiniz, ancak bu verimsizdir. Bir AsyncTaskkez çalışacak, verileri geri gönderecek ve yapılacak bir kullanmak çok daha hızlıdır .

Yine de arka planda sürekli bir şeyler yapmanız gerekiyorsa, a Serviceen iyi bahistir. Buna örnek olarak müzik çalma, sürekli yeni veriler kontrol etme vb. Verilebilir.

Ayrıca, Şerif'in daha önce de söylediği gibi, hizmetlerin UI iş parçacığından kaçması gerekmez.

Çoğunlukla, Services, uygulamanız Activityaçık olmasa bile kodu çalıştırmak istediğiniz zaman içindir . AsyncTaskUI iş parçacığı dışında kod yürütme inanılmaz derecede basit yapmak için tasarlanmıştır.


2
O 2010 Google I / O bu konuşma o ilginç youtube.com/watch?v=xHXn3Kg2IQE sunum REST API veri alma ve ilki bir hizmeti kullanan 3 farklı yöntem verir. Ben bir Android uzmanı değilim ama aynı zamanda Computerish'in söylediklerinin temel olarak doğru olduğu izlenimindeydim.
wuliwong

10
Son paragraf olan "Hizmetler, uygulamanızın Etkinliği açık olmasa bile kodu çalıştırmak istediğiniz zamanlar içindir". Bu, AsyncTask veya arka plan iş parçacıkları için de geçerlidir. etkinliğinize geri döndüğünüzde veya bitirdiğinizde () ve etkinliğiniz görünmediğinde, ancak uygulama işleminizi öldürene kadar arka plan iş parçacıklarınız yine de yürütülür (örn. son görevlerden geçiş yaparak). Ben 4.4.2 Google Nexus AOSP orfoz bu kontrol ettikten
Shirish Herwade

10
Ancak AsyncTask, AsyncTask hala çalışırken ve öldürüldüğünde kullanıcı arayüzünü güncellemesi gerektiğinde başlatılan Etkinlik öldürülürse zor olabilir ... (Etkinlik zaten yok edildiğinden beri çalışmayacaktır). Manuel olarak durdurmanız gerekmeyen bir IntentService kullanmıyorsunuz, çünkü bir kez bittiğinde bitiyor?
AgentKnopf

büyük puanlar. hizmet hakkında iyi bir açıklama.Bu hizmet bile iş arka planda sürekli çalışıyor çalışıyor.
BABU K

3
@LarsH Yanlışsam beni düzeltin, ancak aktivitenizde / Parçanızda bir BroadcastReceiver kullanabileceğinizi ve IntentService'ten işiniz bittiğinde bir Yayını ateşleyeceğinizi düşünüyorum. Kapsama girmesi gereken Etkinlik / Parçanın yeniden oluşturulması üzerine Yayınlara yeniden kaydolabileceğiniz için. Başka bir alternatif UI güncellemek için bir EventBus kullanmak olacaktır (gerçi bunlardan kaçınmaya çalışıyorum - imo takip zorlaştırır).
AgentKnopf

58

Hizmetler tamamen farklıdır: Hizmetler olmayan ipler !

Etkinliğiniz bir hizmete bağlanır ve hizmet, çağrıldığında çağıran iş parçacığını engelleyen bazı işlevler içerir. Hizmetiniz sıcaklığı Celsius'tan Dereceye değiştirmek için kullanılabilir. Bağlanan herhangi bir etkinlik bu hizmeti alabilir.


Ancak AsyncTask, arka planda bazı işler yapan ve aynı zamanda sonuçları çağıran iş parçacığına geri bildirme yeteneğine sahip bir iş parçacığıdır.

Sadece bir düşünce: Bir hizmetin bir AsyncTasknesnesi olabilir !


2
Hizmetler, arka planda çalışan olarak tanımlanır, ancak ur uygulamanız kapatıldığında bile devam eder. AsyncTask ayrıca arka planda bir şey yapmak için kullanılır. Ne demek istediğimi biliyorsun?
erikbwork

1
evet ama hizmetler bir şeyler yapıyor olabilir de olmayabilir de. Uzun ömürlü bir NESNE
Şerif elKhatib

"Bir hizmetin AsyncTask nesnesi olabilir!" Bunu işaret ettiğiniz için teşekkürler. Ama bu iyi bir fikir mi - tavsiye edeceğiniz bir şey mi? Yoksa bir hizmette daha temel diş açma tekniklerini kullanmak daha mı iyi olur?
RenniePet

"Faaliyetiniz bir hizmete bağlanır" olmak zorunda değildir.
JacksOnF1re

@ JacksOnF1re Ben kodlama ilk başladığım zaman böyle olduğunu biliyorum: p ama "senin faaliyet bir hizmete bağlanır" gerçek bir ifadedir. Ben de bu hizmete bağlayıcı olabilir. Bir buzdolabı da bağlayıcı olabilir. Bu ifadeyi geçersiz yapmaz .. neyse jk
Sherif elKhatib

7

ServiceAndroid çerçevesinin, kullanıcı arayüzünün yürütülmesini gerektirmeyen bileşenlerden biridir, yani uygulama kullanıcı tarafından aktif olarak kullanılmasa bile, hizmetle bazı işlemler gerçekleştirebilirsiniz. Bu, hizmetin ayrı bir iş parçacığında çalışacağı anlamına gelmez, ancak ana iş parçacığında çalışır ve gerektiğinde işlem ayrı bir iş parçacığında gerçekleştirilebilir. Örnek kullanımlar, arka planda müzik çalmak, verileri kullanıcı etkileşimi olmadan backgroud'daki sunucu ile senkronize etmektir.

AsyncTaskÖte yandan UI engelleme görevlerinin ayrı bir iş parçacığında gerçekleştirilmesi için kullanılır. Yeni bir iş parçacığı oluşturmak ve iş parçacıklarını oluşturmak ve bakımını yapmak ve ana iş parçacığına sonuç göndermek gibi tüm görevler AsyncTask tarafından ele alındığında görev yapmak gibidir. Örnek kullanım sunucudan veri alıyor, içerik çözümleyici üzerindeki CRUD işlemleri vb.


cevabınızın soruya neden bir şey eklediğini düşündüğünüzü belirtebilir misiniz?
erikbwork

2
diğer cevaplar ya yeni başlayanlar için çok kısa ya da çok uzun. bu yüzden örneklerle tam olarak basit kelimelerle cevap verdim
arjun

6

Hizmet ve zaman uyumsuzluk neredeyse aynı şeyi yapıyor, neredeyse hizmet veya zaman uyumsuzluk gereksiniminizin ne olduğuna bağlı.

örnek olarak, bir düğmeye bastıktan veya ekranı değiştirdikten sonra bir sunucudan bir liste görünümüne veri yüklemek istiyorsanız, asynctask.it ile ana ui iş parçacığına (arka planda çalışır) paralel olarak çalışırsanız veya uygulamanızın çalışması için ana UI iş parçacığı üzerinde. app çıktıktan sonra hiçbir zaman uyumsuz yoktur.

Ancak hizmetler böyle değildir, bir hizmeti başlattığınızda, hizmeti durdurmadığınız sürece uygulamadan çıktıktan sonra çalışabilir. Dediğim gibi bu sizin gereksiniminize bağlıdır. Veri alımını kontrol etmek veya ağ durumunu kontrol etmek istiyorsanız sürekli hizmet ile gitmek daha iyi.

mutlu kodlama.


1
Merhaba Ashana, bu cevabı neden zaten cevaplanmış bir soruya verdiğinizi sorabilir miyim? Mevcut işaretli cevaptan memnun değil misiniz? Ya da hakkında söyleyecekleriniz olan tüm sorulara görüşlerinizi yazarak bir SO profili oluşturmaya çalışıyorsunuz? Yoksa tamamen farklı bir şey mi? Anlayamıyorum, ama son zamanlarda bu modeli görüyorum.
erikbwork

3
Ya biliyorum cevap zaten verilmiş ve burada doğru cevabı veya fikrimi verirseniz burada fazla sorun görmüyorum kardeşim? çünkü aynı sorunun cevabını arayan tek kişi siz değilsiniz, eğer yukarıdaki cevaplardaki çözümü anlamak zorsa, kendileri için uygun bir cevap aramak için aşağıya inebilir, kolayca anlayın. Yorum için teşekkürler kardeşim, ben bir dahi veya programlama
uzmanı değilim

1

Bazı durumlarda, her ikisini de kullanarak aynı işlevselliği elde edebilirsiniz. Async Görevinden farklı olarak, hizmetin kendi yaşam döngüsü vardır ve Bağlam'ı devralır (Hizmet, Async Görevinden daha sağlamdır). Uygulama, uygulamadan çıkmış olsanız bile çalışabilir. Uygulama kapatıldıktan sonra bile bir şeyler yapmak istiyorsanız ve bağlam değişkenine de ihtiyacınız varsa, Hizmet'e gidersiniz.

Örnek: Bir müzik çalmak istiyorsanız ve kullanıcı uygulamadan ayrılırsa duraklatmak istemiyorsanız, kesinlikle Hizmete gidersiniz.


1

Bir karşılaştırılması yerel, işlem içi, taban sınıf Servisi bir etmek ✱ AsyncTask:

✱ (Bu yanıt, dışa aktarılan hizmetleri veya istemcininkinden farklı bir süreçte çalışan herhangi bir hizmeti ele almaz, çünkü beklenen kullanım durumları birinkinden önemli ölçüde farklıdır AsyncTask. Servicealt sınıflar (ör. IntentService, JobService) burada yok sayılır.)

Süreç Ömrü

A Service, işletim sistemine "uygulamanın kullanıcıyla etkileşimde bulunmadan daha uzun süre çalışan bir işlem gerçekleştirme isteğini" temsil eder [ ref ].

Eğer bir sahipken Serviceçalışan, Android Eğer süreç öldürülmek istemiyoruz anlar. Bu, bir Activityekranınız olduğunda da geçerlidir ve özellikle bir ön plan hizmeti çalıştırdığınızda doğrudur . (Tüm uygulama bileşenleriniz kaybolduğunda, Android "Ah, şimdi bu uygulamayı öldürmek için iyi bir zaman, bu yüzden kaynakları serbest bırakabilirim" diye düşünüyor.)

Ayrıca, son dönüş değerine bağlı olarak Service.onCreate()Android, kaynak baskısı [ ref ] nedeniyle öldürülen uygulamaları / hizmetleri "canlandırmaya" çalışabilir .

AsyncTasksbunlardan hiçbirini yapma. Kaç tane arka plan iş parçacığı çalıştığınız veya ne kadar çok çalıştıkları önemli değildir: Android, uygulamanız CPU kullanıyor olduğundan uygulamanızı canlı tutmayacaktır. Uygulamanızın hala yapacak işleri olduğunu bilmenin bir yolu olmalı ; bu yüzden Servicesişletim sistemine kayıtlısınız ve kayıtlı AsyncTasksdeğilsiniz.

Çok iş parçacığı

AsyncTasks tamamen üzerinde çalışılacak bir arka plan iş parçacığı oluşturmak ve daha sonra bu çalışmanın sonucunu bir evre güvenli bir şekilde UI iş parçacığına sunmakla ilgilidir.

Her yeni AsyncTaskyürütme genellikle AsyncTasks'sthread-pool [ ref ] sınırlamalarına tabi olarak daha fazla eşzamanlılık (daha fazla thread) ile sonuçlanır .

ServiceÖte yandan, yöntemler her zaman UI iş parçacığında [ ref ] çağrılır . Şunun için geçerlidir onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), vb Yani, bir bakıma, Servicesarka planda değil "run" yok. Bir kez başladıktan sonra ( onCreate()), orada "oturmak" gibi - temizlenme, yürütme onStartCommand()vb.

Başka bir deyişle, ek eklemek Servicesdaha fazla eşzamanlılık ile sonuçlanmaz. Hizmet yöntemleri , UI iş parçacığında çalıştıkları için büyük miktarda iş yapmak için iyi bir yer değildir .

Tabii ki, genişletebilir Service, kendi yöntemlerinizi ekleyebilir ve bunları istediğiniz herhangi bir iş parçacığından çağırabilirsiniz. Ancak bunu yaparsanız, iplik güvenliği sorumluluğu size aittir - çerçeve değil.

Bir arka plan iş parçacığı (veya başka bir tür işçi) eklemek istiyorsanız Service, bunu yapmakta özgürsünüz. Örneğin bir arka plan iş parçacığı / AsyncTaskgirişi başlatabilirsiniz Service.onCreate(). Ancak tüm kullanım durumları bunu gerektirmez. Örneğin:

  • Service"Arka planda" konum güncellemelerini almaya devam edebilmeniz için çalışmaya devam etmek isteyebilirsiniz (yani, Activitiesekranda herhangi bir şeye sahip olmadan ).
  • Ya da uygulamanızı canlı tutmak isteyebilirsiniz, böylece "örtük" bir dosyayı BroadcastReceiveruzun vadede kayıtlı tutabilirsiniz (API 26'dan sonra bunu manifest üzerinden her zaman yapamazsınız, bunun yerine çalışma zamanında kayıt olmanız gerekir. [ ref ]).

Bu kullanım durumlarının hiçbiri çok fazla CPU etkinliği gerektirmez; sadece uygulamanın öldürülmemesini gerektirir .

İşçi Olarak

Servicesgörev odaklı değil. Bunlar, "bir görevi yerine getirmek" ve "bir sonuç sunmak" için ayarlanmamıştır AsyncTasks. Servicesherhangi bir iplik güvenliği sorununu çözmeyin (tüm yöntemlerin tek bir iş parçacığında yürütülmesine rağmen). AsyncTasksÖte yandan, bu karmaşıklığı sizin için halledin.

Not AsyncTaskolan kullanımdan kaldırılması planlanan . Ama bu sizin yerine AsyncTasksile değiştirmeniz gerektiği anlamına gelmez Services! (Eğer bu cevaptan bir şey öğrendiyseniz, çok şey açık olmalıdır.)

TL; DR

Servicesçoğunlukla "var olmak" için vardır. ActivityDiğer bileşenler "iş" yapmakla ilgilenirken, uygulamanın ekran dışı kalması için bir neden sağlayan bir ekran dışı gibidirler . AsyncTasks"iş" yaparlar, ancak kendi başlarına bir süreci canlı tutmazlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.