Hizmet, Zaman uyumsuz Görev ve İş Parçacığı arasındaki fark?


148

Service, Async Task & Thread arasındaki fark nedir. Yanılmıyorsam hepsi arka planda bazı şeyler yapmak için kullanılıyor. Peki hangisinin ne zaman kullanılacağına nasıl karar verilir?


İnsanların sık sık kafasının karışabileceği bir şey daha var gibi görünüyor - Yükleyiciler . İlgili konu - Asynctask vs Thread vs Services vs Loader
RBT

Yanıtlar:


185

Muhtemelen onlar hakkındaki dokümantasyon açıklamasını zaten okudunuz, onları tekrar etmeyeceğim, bunun yerine kendi kelimelerimle cevap vermeye çalışacağım, umarım size yardımcı olurlar.

  • Hizmet bir Etkinlik gibidir ancak kullanıcı arabirimi yoktur. Muhtemelen örneğin hava durumunu almak istiyorsanız bunun için boş bir etkinlik oluşturmayacaksınız, bunun için bir Hizmet kullanacaksınız.

  • Bir İş Parçacığı bir İş Parçacığıdır, muhtemelen onu diğer kısımdan zaten biliyorsunuzdur. Bir İş Parçacığından UI'yi güncelleyemeyeceğinizi bilmeniz gerekir. Bunun için bir İşleyici kullanmanız gerekir, ancak daha fazlasını okuyun.

  • Bir AsyncTask, kullanılması önerilen akıllı bir İş Parçacığıdır. Yöntemlerine yardımcı olabileceği için akıllıdır ve UI bileşenlerini güncellemek için iyi olan UI iş parçacığında çalışan üç yöntem vardır.

Hizmetleri, AsyncTasks sık sık kullanıyorum. AsyncTask ile neredeyse her şeyi yapabildiğim için daha az iş parçacığı veya hiç yok.


1
Açıklaman için teşekkürler. Öyleyse, web'den veri alan bir uygulama yapmam gerekirse, hangisi daha iyi bir seçenek hizmeti veya zaman uyumsuz görev olur?
SpunkerBaba

16
İkisini de kullanmanız gerekiyor. Bir Hizmet oluşturursunuz ve içinde AsyncTask kullanırsınız.
Pentium10

4
Yukarıdaki yanıta ek olarak, AsyncTask onPreExecute (), onProgressUpdate (Progress ...) onPostExecute (Sonuç), {UI iş parçacığında çalışıyor}, doInBackground (Params ...) {arka planda çalışıyor} 4 adımdan geçer. UI iş parçacığında 3 yöntem sağladığından, kullanıcının UI'yi güncellemek için işleyicileri veya geri aramaları kullanma konusunda endişelenmesine gerek yoktur.
SpunkerBaba

11
@ Pentium10: Service + AsyncTask yerine genellikle bir IntentService kullanabilirsiniz
njzk2

11
Ayrıca dikkat çekici olan, varsayılan olarak Android hizmetlerinin ana (UI) iş parçacığında çalışmasıdır. Hizmetinizin arka planda çalışması gerekiyorsa, ayrı bir iş parçacığında (veya AsyncTask) açıkça başlatılması gerekir. Aksi takdirde, kullanıcı arayüzünün yanıt verme hızını kesintiye uğratabilir ve Uygulama Yanıt Vermiyor hataları atabilir. Android tabanlı bir hizmet, esasen 'görünmez' ve 'minyatür' bir Etkinliktir, mutlaka bir 'arka plan' çalışanı DEĞİLDİR.
CCJ

23

Sorunuz için en kolay cevap budur

Konu

Ana İş Parçacığına "paralel" çalışan bir yürütme birimidir önemli bir noktadır, ana iş parçacığı dışında herhangi bir iş parçacığından bir UI bileşenini güncelleyemezsiniz.

AsyncTask

AsyncTask bir arka plan iş parçacığında çalışacak olsa bile temelde UI'yi güncelleyebilmeniz için size UI'yi güncellemeniz için yardımcı yöntemler sağlayan özel bir iş parçacığıdır. İşlemler arası iletişim işleminin açık bir şekilde yapılması gerekli değildir.

Hizmet

Yukarıdaki sorunu çözün çünkü onu çağıran etkinlikten ayrı yaşıyor, böylece etkinlik yok edildiğinde bile çalışmaya devam edebilir , Ana İş Parçacığında çalışır (ANR'ye dikkat edin) bir arka plan hizmeti kullanın (IntentService'i genişletin, işçi iş parçacığını otomatik olarak oluşturur sizin için) . Hizmet, kullanıcı arayüzü olmayan bir etkinlik gibidir , uzun görevler için iyidir


4
AyncTask, Activity yaşam döngüsü yöntemleriyle senkronize olmadığı için cihazı döndürürken yeniden oluşturulmaz.
CopsOnRoad

4
AsyncTask'ı bir Etkinlik yaşam döngüsü kancasında oluşturursunuz ve telefonu döndürdüğünüzde Etkinlik yok edilir ve yeniden başlatılır. AsyncTask'ın önceki örneği, yok ettiğiniz Aktiviteye bağlıdır ve bu nedenle bir "Kapatmaya Zorla" alacaksınız, ancak AsynTask'ın yeni bir örneğinin nasıl yeniden tetiklendiğini de göreceksiniz. Fragments'ı AsyncTask'ı korumak ve size yardımcı olacak Fragment üzerinde setRetainInstance (true) olarak ayarlamak için kullanabilirsiniz.
Alejandro Serret

15

Birinin bana birkaç gün önce söylemesini isterdim:

  • Faaliyetler ve Hizmetler arasında genel değişkenleri - iş parçacıkları gibi - paylaşabilirsiniz.
  • Kişisel başvuru tüm global değişkenleri ile birlikte sürece hala mevcut orada bir Hareketi veya Servis olarak sildi edilmeyecektir.
  • Uygulamanızda bir Hizmet örneğiniz varsa ve işletim sistemi kaynaklara ihtiyaç duyuyorsa, önce Faaliyetlerinizi sonlandırır, ancak Hizmet olduğu sürece işletim sistemi uygulamanızı global değişkenleriyle birlikte silmez.

Kullanım durumum şöyle: Küresel alanda bir sunucuya bağlı bir iş parçacığım ve sonuçları gösteren bir Etkinlik var. Kullanıcı ana sayfa düğmesine bastığında Etkinlik arka plana gider ve yeni bir Hizmet başlatılır. Bu hizmet daha sonra iş parçacığından alınan sonuçları okur ve gerektiğinde bildirim alanında bilgileri görüntüler. İşletim sisteminin Aktivitemi yok etmesi konusunda endişelenmiyorum çünkü Servis çalıştığı sürece iş parçacığını yok edeceğini biliyorum.


9

Kısacası, Service for time consuming tasks, AsyncTask for short-lived tasks, Thread bir standard java constructioniş parçacığı içindir.


3

Geliştiricinin bakış açısından:

Thread : Ana iş parçacığına paralel olarak kod setini yürütmek için kullanılır. Ancak iş parçacığı içindeki kullanıcı arayüzünü işleyemezsiniz. Bunun için kullanmanız gerekiyor Handler. Hadler iş parçacığı gibi çalışır, ancak kullanıcı arayüzünü de kullanabilir.

ASyncTask : Ana iş parçacığı üzerinde çalışmak için yapamayacağınız görevleri işlemek için kullanılır. Örneğin, bir HTTP isteği, ana iş parçacığında işlenemeyen çok ağır bir iştir, bu nedenle HTTP isteğini ASyncTaskarka planda Asenkron olarak ana iş parçacığınızla paralel olarak işlersiniz. Etkinlikler.

Hizmet : Bir arka plan işlemidir. Kendisiyle ilişkilendirilmiş herhangi bir kullanıcı arayüzü olmayan bazı işlemler yapmanız gerektiğinde kullanılır.


1
Servicekullanmadığınız sürece arka planda çalıştırmanız gerekmez IntentService. ServiceUiThread'den bir standart başlatırsanız, UiThread üzerinde çalışacaktır.
yshahak

@yshahak Doğru söylüyorsunuz, ama burada derin bir tanıma ihtiyacımız yok. Kullanıcı sadece aralarındaki farkı bilmek ister.
Rahul Raina

Evet, ancak bu doğru değildir, çünkü Servicevarsayılan olarak farklı bir işlemde çalışmaz, ancak diğer bileşenlerle uygulama sürecinde çalışır. Söylemesi daha iyi, Serviceiçinde yaşadığı İş Parçacığının Arka Planında çalışacak.
yshahak

Yukarıdaki üç işlemin tümü başvuru sürecinde çalışır. ASyncTask'ın preExecute () ve postExecute () yöntemleri UIThread üzerinde çalışır ve doInBackground () & onProgress () arka planda çalışır. Hizmet Arka Plan iş parçacığında çalışır ve İş Parçacığı da arka plan iş parçacığında çalışır. Ancak İşleyici, UI İş Parçacığı üzerinde çalışır.
Rahul Raina

2

hizmet, etkinlik uzun zaman alan bir görev gibidir, ancak Async görevi, uzun / arka plan işlemleri gerçekleştirmemize ve iş parçacıklarını değiştirmek zorunda kalmadan UI iş parçacığında sonucunu göstermemize izin verir.

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.