Dalam beberapa kasus adalah mungkin untuk menyelesaikan tugas yang sama dengan salah satu AsyncTask
atau yang Service
bagaimanapun biasanya satu lebih cocok untuk tugas daripada yang lain.
AsyncTask
s dirancang untuk tugas yang menghabiskan waktu sekali yang tidak dapat dijalankan dari utas UI. Contoh umum adalah mengambil / memproses data ketika tombol ditekan.
Service
s dirancang untuk terus berjalan di latar belakang. Pada contoh di atas pengambilan data saat tombol ditekan, Anda dapat memulai layanan, membiarkannya mengambil data, dan kemudian menghentikannya, tetapi ini tidak efisien. Jauh lebih cepat menggunakan AsyncTask
yang akan berjalan sekali, mengembalikan data, dan selesai.
Namun, jika Anda perlu terus melakukan sesuatu di latar belakang, a Service
adalah taruhan terbaik Anda. Contohnya termasuk memutar musik, terus-menerus memeriksa data baru, dll.
Juga, seperti yang sudah dikatakan Sherif, layanan tidak perlu lari dari utas UI.
Sebagian besar, Service
adalah untuk ketika Anda ingin menjalankan kode bahkan ketika aplikasi Anda Activity
tidak terbuka. AsyncTask
s dirancang untuk membuat kode eksekusi dari utas UI sangat sederhana.
Layanan sama sekali berbeda: Layanan bukan utas !
Aktivitas Anda mengikat ke layanan dan layanan berisi beberapa fungsi yang ketika dipanggil, memblokir utas panggilan. Layanan Anda mungkin digunakan untuk mengubah suhu dari Celcius ke Derajat. Aktivitas apa pun yang mengikat dapat memperoleh layanan ini.
Namun
AsyncTask
adalah Thread yang berfungsi di latar belakang dan pada saat yang sama memiliki kemampuan untuk melaporkan hasil kembali ke utas panggilan.Hanya sebuah pemikiran: Suatu layanan mungkin memiliki
AsyncTask
objek!sumber
Service
adalah salah satu komponen kerangka Android, yang tidak memerlukan UI untuk mengeksekusi, yang berarti bahkan ketika aplikasi tidak secara aktif digunakan oleh pengguna, Anda dapat melakukan beberapa operasi dengan layanan. Itu tidak berarti layanan akan berjalan di utas yang terpisah, tetapi itu berjalan di utas utama dan operasi dapat dilakukan di utas terpisah bila diperlukan. Contoh penggunaan adalah memutar musik di latar belakang, menyinkronkan data dengan server di backgroud tanpa interaksi pengguna, dllAsyncTask
di sisi lain digunakan untuk tugas-tugas memblokir UI yang akan dilakukan pada utas terpisah. Sama seperti membuat utas baru dan melakukan tugas ketika semua tugas membuat dan memelihara utas dan mengirim kembali hasil ke utas utama ditangani oleh AsyncTask. Contoh penggunaan adalah mengambil data dari server, operasi CRUD pada penyelesai konten dllsumber
Layanan dan asynctasks hampir melakukan hal yang sama, hampir. Menggunakan layanan atau asynctask tergantung pada apa kebutuhan Anda.
sebagai contoh jika Anda ingin memuat data ke tampilan daftar dari server setelah menekan beberapa tombol atau mengubah layar Anda lebih baik pergi dengan asynctask.it berjalan paralel dengan utas ui utama (berjalan di latar) .untuk menjalankan aktivitas asynctack atau aplikasi Anda harus pada utas UI utama.setelah keluar dari aplikasi tidak ada asynctask.
Tetapi layanan tidak seperti itu, setelah Anda memulai layanan itu dapat berjalan setelah Anda keluar dari aplikasi, kecuali jika Anda menghentikan layanan. Seperti saya katakan itu tergantung pada kebutuhan Anda. Jika Anda ingin terus memeriksa penerimaan data atau memeriksa status jaringan terus menerus Anda lebih baik pergi dengan layanan.
selamat coding
sumber
Dalam beberapa kasus, Anda dapat mencapai fungsi yang sama menggunakan keduanya. Tidak seperti Tugas Async, layanan memiliki siklus hidupnya sendiri dan mewarisi Konteks (Layanan lebih kuat daripada Tugas Async). Layanan dapat berjalan bahkan jika Anda telah keluar dari aplikasi. Jika Anda ingin melakukan sesuatu bahkan setelah penutupan aplikasi dan juga memerlukan variabel konteks, Anda akan pergi untuk Layanan.
Contoh: Jika Anda ingin memainkan musik dan Anda tidak ingin menjeda jika pengguna meninggalkan aplikasi, Anda pasti akan pergi ke Layanan.
sumber
Perbandingan Layanan kelas dasar, dalam proses, dasar ✱ dengan
AsyncTask
:✱ (Jawaban ini tidak membahas layanan yang diekspor, atau layanan apa pun yang berjalan dalam proses yang berbeda dari klien, karena kasus penggunaan yang diharapkan berbeda secara substansial dengan yang ada pada
AsyncTask
. Juga, untuk kepentingan singkatnya, sifat khusus tertentuService
subclass (mis.IntentService
,JobService
) akan diabaikan di sini.)Proses Seumur Hidup
A
Service
mewakili, untuk OS, "keinginan aplikasi untuk melakukan operasi yang berjalan lebih lama sementara tidak berinteraksi dengan pengguna" [ ref ].Saat Anda
Service
menjalankan, Android memahami bahwa Anda tidak ingin proses Anda terbunuh. Ini juga benar setiap kali Anda memilikiActivity
layar, dan itu terutama berlaku ketika Anda menjalankan layanan latar depan . (Ketika semua komponen aplikasi Anda hilang, Android berpikir, "Oh, sekarang adalah waktu yang tepat untuk mematikan aplikasi ini, jadi saya dapat membebaskan sumber daya".)Juga, tergantung pada nilai pengembalian terakhir dari
Service.onCreate()
, Android dapat mencoba untuk "menghidupkan kembali" aplikasi / layanan yang terbunuh karena tekanan sumber daya [ ref ].AsyncTasks
jangan lakukan itu. Tidak peduli berapa banyak utas latar yang Anda jalankan, atau seberapa keras mereka bekerja: Android tidak akan membuat aplikasi Anda tetap hidup hanya karena aplikasi Anda menggunakan CPU. Itu harus memiliki beberapa cara untuk mengetahui bahwa aplikasi Anda masih memiliki pekerjaan yang harus dilakukan; itu sebabnyaServices
terdaftar di OS, danAsyncTasks
tidak.Multithreading
AsyncTasks
semua tentang membuat utas latar untuk melakukan pekerjaan, dan kemudian mempresentasikan hasil pekerjaan itu ke utas UI dengan cara yang aman.Setiap
AsyncTask
eksekusi baru umumnya menghasilkan lebih banyak konkurensi (lebih banyak utas), tergantung pada batasan dariAsyncTasks's
kumpulan utas [ ref ].Service
metode, di sisi lain, selalu dipanggil pada utas UI [ ref ]. Hal ini berlaku untukonCreate()
,onStartCommand()
,onDestroy()
,onServiceConnected()
, dll Jadi, dalam arti,Services
tidak "lari" di latar belakang. Begitu mereka mulai (onCreate()
), mereka hanya "duduk" di sana - sampai tiba waktunya untuk membersihkan, mengeksekusionStartCommand()
, dll.Dengan kata lain, menambahkan tambahan
Services
tidak menghasilkan lebih banyak konkurensi. Metode layanan bukan tempat yang baik untuk melakukan banyak pekerjaan, karena mereka berjalan di utas UI .Tentu saja, Anda dapat memperluas
Service
, menambahkan metode Anda sendiri, dan memanggil mereka dari utas yang Anda inginkan. Tetapi jika Anda melakukan itu, tanggung jawab untuk keselamatan benang ada pada Anda - bukan kerangka kerjanya.Jika Anda ingin menambahkan utas latar (atau semacam pekerja lain) ke Anda
Service
, Anda bebas untuk melakukannya. Anda bisa memulai thread latar belakang /AsyncTask
diService.onCreate()
, misalnya. Tetapi tidak semua kasus penggunaan memerlukan ini. Sebagai contoh:Service
menjalankannya sehingga Anda dapat terus mendapatkan pembaruan lokasi di "latar belakang" (artinya, tanpa harus memilikiActivities
layar).BroadcastReceiver
terdaftar " secara jangka panjang (setelah API 26, Anda tidak selalu dapat melakukan ini melalui manifes, jadi Anda harus mendaftar saat runtime sebagai gantinya [ ref ]).Tak satu pun dari kasus penggunaan ini membutuhkan banyak aktivitas CPU; mereka hanya meminta agar aplikasi tidak terbunuh .
Sebagai Pekerja
Services
tidak berorientasi pada tugas. Mereka tidak diatur untuk "melakukan tugas" dan "memberikan hasil", sepertiAsyncTasks
juga.Services
jangan menyelesaikan masalah keamanan thread (terlepas dari kenyataan bahwa semua metode dijalankan pada satu thread).AsyncTasks
, di sisi lain, atasi kompleksitas itu untuk Anda.Perhatikan bahwa
AsyncTask
ini dijadwalkan untuk bantahan . Tetapi itu tidak berarti Anda harus menggantiAsyncTasks
dengan AndaServices
! (Jika Anda telah belajar sesuatu dari jawaban ini, itu harus jelas.)TL; DR
Services
sebagian besar ada di sana untuk "ada". Mereka seperti di luar layarActivity
, memberikan alasan bagi aplikasi untuk tetap hidup, sementara komponen lain mengurus melakukan "pekerjaan".AsyncTasks
melakukan "pekerjaan", tetapi mereka tidak akan, dalam dan dari diri mereka sendiri, menjaga proses tetap hidup.sumber