Perbedaan antara Layanan, Async, Tugas & Utas?

Jawaban:

186

Mungkin Anda sudah membaca deskripsi dokumentasi tentang mereka, saya tidak akan mengulanginya, sebaliknya saya akan mencoba memberikan jawaban dengan kata-kata saya sendiri, semoga mereka akan membantu Anda.

  • Layanan seperti Kegiatan tetapi tidak memiliki antarmuka pengguna. Mungkin jika Anda ingin mengambil cuaca misalnya, Anda tidak akan membuat aktivitas kosong untuk itu, karena ini Anda akan menggunakan Layanan.

  • Thread adalah Thread, mungkin Anda sudah tahu dari bagian lain. Anda perlu tahu bahwa Anda tidak dapat memperbarui UI dari Thread. Anda perlu menggunakan Handler untuk ini, tetapi baca lebih lanjut.

  • AsyncTask adalah Thread cerdas yang disarankan untuk digunakan. Cerdas karena dapat membantu dengan metode itu, dan ada tiga metode yang berjalan di utas UI, yang bagus untuk memperbarui komponen UI.

Saya sering menggunakan Layanan, AsyncTasks. Kurangi utas, atau tidak sama sekali, karena saya dapat melakukan hampir semua hal dengan AsyncTask.

Pentium10
sumber
1
Terima kasih atas penjelasan anda Jadi, jika saya perlu membuat aplikasi yang mengambil data dari web, yang akan menjadi layanan opsi yang lebih baik atau tugas async?
SpunkerBaba
16
Anda harus menggunakan keduanya. Anda membuat Layanan dan di dalamnya Anda menggunakan AsyncTask.
Pentium10
4
Tambahkan ke jawaban di atas, AsyncTask berjalan melalui 4 langkah diPreExecute (), onProgressUpdate (Progress ...) onPostExecute (Hasil), {running in UI thread}, doInBackground (Params ...) {running in background thread}. Karena menyediakan 3 metode di utas UI, pengguna tidak perlu khawatir tentang menggunakan penangan atau panggilan balik untuk memperbarui UI.
SpunkerBaba
11
@ Pentium10: alih-alih Layanan + AsyncTask, Anda sering dapat menggunakan IntentService
njzk2
11
Yang juga patut dicatat adalah bahwa secara default layanan Android berjalan di utas utama (UI). Jika layanan Anda perlu melakukan pekerjaan di latar belakang, layanan tersebut harus diluncurkan di utas terpisah (atau AsyncTask) secara eksplisit. Jika tidak, dapat beresiko mengganggu respons UI dan membuang Aplikasi Tidak Menanggapi kesalahan. Sebuah layanan yang Android pada dasarnya adalah Kegiatan 'tidak terlihat' dan 'miniatur', BUKAN selalu merupakan pekerja 'latar belakang'.
CCJ
23

Ini adalah jawaban termudah untuk pertanyaan Anda

Benang

adalah unit eksekusi yang menjalankan "paralel" ke utas utama adalah poin penting, Anda tidak dapat memperbarui komponen UI dari utas apa pun di sini kecuali utas utama.

AsyncTask

adalah utas khusus, yang memberi Anda metode pembantu untuk memperbarui UI sehingga pada dasarnya Anda dapat memperbarui UI bahkan AsyncTask akan berjalan pada utas latar belakang. Penanganan komunikasi antarproses tidak perlu dilakukan secara eksplisit.

Layanan

pecahkan masalah di atas karena ia hidup terpisah dari aktivitas yang memanggilnya sehingga ia dapat terus berjalan bahkan ketika aktivitas dihancurkan, ia berjalan di Main Thread (waspadalah terhadap ANR) menggunakan layanan latar belakang (memperpanjang IntentService itu membuat thread pekerja secara otomatis untukmu) . Layanan seperti aktivitas tanpa UI , bagus untuk tugas panjang

Alejandro Serret
sumber
4
AyncTask tidak akan dibuat ulang saat memutar perangkat karena tidak selaras dengan metode siklus aktivitas.
CopsOnRoad
4
Anda membuat AsyncTask dalam kait siklus aktivitas dan ketika Anda memutar telepon, Aktivitas dihancurkan dan dihidupkan ulang. Instance previus dari AsyncTask terhubung ke Activity yang baru saja Anda hancurkan dan untuk alasan itu Anda akan mendapatkan "Force Close" tetapi Anda juga akan melihat bagaimana instance baru dari AsynTask mendapatkan pemicu lagi. Anda dapat menggunakan Fragmen untuk mempertahankan AsyncTask dan mengatur setRetainInstance (true) pada Fragmen yang akan membantu Anda.
Alejandro Serret
15

Beberapa informasi lebih lanjut saya berharap seseorang mengatakan kepada saya beberapa hari yang lalu:

  • Anda dapat berbagi variabel global - seperti utas - antara Aktivitas dan Layanan.
  • Aplikasi Anda bersama dengan semua variabel globalnya tidak akan dihapus selama masih ada Kegiatan atau Layanan.
  • Jika Anda memiliki instance Layanan di aplikasi Anda dan OS membutuhkan sumber daya, pertama-tama membunuh Aktivitas Anda, tetapi selama ada Layanan, OS tidak akan menghapus aplikasi Anda bersama dengan variabel globalnya.

Kasus penggunaan saya adalah seperti ini: Saya memiliki satu utas di ruang global yang terhubung ke server dan Kegiatan yang menunjukkan hasilnya. Saat pengguna menekan tombol beranda, Kegiatan beralih ke latar belakang dan Layanan baru dimulai. Layanan ini kemudian membaca hasil dari utas dan menampilkan informasi di area notifikasi ketika diperlukan. Saya tidak khawatir tentang OS yang menghancurkan Aktivitas saya karena saya tahu bahwa selama Layanan berjalan tidak akan merusak utas.

Peter Jankuliak
sumber
9

Singkatnya, Layanan untuk time consuming tasks, AsyncTask untuk short-lived tasks, Utas adalah standard java constructionuntuk utas.

Abbath
sumber
3

Dari perspektif pengembang:

Utas : Digunakan untuk mengeksekusi kode yang diset ke pararel ke utas utama. Tetapi Anda tidak dapat menangani UI di dalam utas. Untuk itu perlu Anda gunakan Handler. Hadler bekerja seperti utas tetapi dapat menangani UI juga.

ASyncTask : Digunakan untuk menangani tugas-tugas yang tidak dapat Anda lakukan untuk bekerja pada utas utama. Sebagai contoh, permintaan HTTP adalah pekerjaan yang sangat berat yang tidak dapat ditangani pada utas utama, sehingga Anda menangani permintaan HTTP dalam ASyncTaskIni berfungsi secara paralel dengan utas utama Anda secara serempak di latar belakang. Ia memiliki beberapa metode panggilan balik yang digunakan pada korespondensi mereka. acara

Layanan : Merupakan proses latar belakang. Ini digunakan ketika Anda harus melakukan beberapa pemrosesan yang tidak memiliki UI yang terkait dengannya.

Rahul Raina
sumber
1
Servicetidak akan perlu dijalankan di latar belakang kecuali Anda menggunakan IntentService. Jika Anda memulai standar Servicedari UiThread, itu akan berjalan pada UiThread.
yshahak
@yshahak Anda benar, tetapi di sini kita tidak perlu definisi yang mendalam. Pengguna hanya ingin tahu perbedaan di antara mereka.
Rahul Raina
Ya, tetapi ini tidak akurat, karena Servicetidak akan berjalan dalam proses yang berbeda secara default, tetapi dalam proses aplikasi dengan komponen lainnya. Lebih baik mengatakan bahwa itu Serviceakan berjalan di Background of the Thread yang hidup di dalamnya.
yshahak
Semua tiga di atas berfungsi dalam proses aplikasi. Metode preynecTute () dan postExecute () ASyncTask bekerja pada UIThread dan doInBackground () & onProgress () bekerja pada utas latar belakang. Layanan bekerja pada utas latar dan utas juga berfungsi pada utas latar. Namun Handler berfungsi di UI Thread.
Rahul Raina
2

layanan seperti aktivitas yang memakan waktu lama, tetapi tugas Async memungkinkan kita untuk melakukan operasi lama / latar belakang dan menunjukkan hasilnya pada utas UI tanpa harus memanipulasi utas.

pankaj
sumber