Android: AsyncTask vs Layanan

138

Mengapa saya membaca dalam jawaban untuk sebagian besar pertanyaan di sini banyak tentang AsyncTaskdan Loader tetapi tidak ada tentang Layanan ? Apakah Layanan tidak dikenal dengan baik atau sudah usang atau memiliki beberapa atribut buruk atau sesuatu? Apa perbedaannya?

(Omong-omong, saya tahu bahwa ada utas lain tentang hal itu, tetapi tidak ada yang benar-benar menyatakan perbedaan yang membantu pengembang untuk dengan mudah memutuskan apakah dia lebih baik menggunakan yang satu atau yang lain untuk masalah yang sebenarnya.)

erikbwork
sumber

Jawaban:

272

Dalam beberapa kasus adalah mungkin untuk menyelesaikan tugas yang sama dengan salah satu AsyncTaskatau yang Servicebagaimanapun biasanya satu lebih cocok untuk tugas daripada yang lain.

AsyncTasks dirancang untuk tugas yang menghabiskan waktu sekali yang tidak dapat dijalankan dari utas UI. Contoh umum adalah mengambil / memproses data ketika tombol ditekan.

Services 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 AsyncTaskyang akan berjalan sekali, mengembalikan data, dan selesai.

Namun, jika Anda perlu terus melakukan sesuatu di latar belakang, a Serviceadalah 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, Serviceadalah untuk ketika Anda ingin menjalankan kode bahkan ketika aplikasi Anda Activitytidak terbuka. AsyncTasks dirancang untuk membuat kode eksekusi dari utas UI sangat sederhana.

Komputeris
sumber
2
Sangat menarik bahwa dalam pembicaraan ini dari Google I / O pada 2010 youtube.com/watch?v=xHXn3Kg2IQE presenter memberikan 3 metode berbeda untuk mendapatkan data dari REST API dan yang pertama menggunakan layanan. Saya bukan ahli Android tetapi saya juga mendapat kesan bahwa apa yang dikatakan Computerish pada dasarnya benar.
wuliwong
10
Paragraf terakhir, "Layanan untuk ketika Anda ingin menjalankan kode bahkan ketika Aktivitas aplikasi Anda tidak terbuka". Ini juga halnya dengan AsyncTask atau utas latar. yaitu ketika Anda menekan kembali dalam aktivitas Anda atau panggilan selesai () dan aktivitas Anda tidak terlihat, tetapi utas latar Anda masih mengeksekusi sampai Anda membunuh proses aplikasi Anda (misalnya dengan bertukar dari tugas-tugas terbaru). Saya telah memeriksanya dengan Kerapu AOSP Google Nexus 4.4.2
Shirish Herwade
10
Namun AsyncTask dapat menjadi rumit jika Aktivitas yang memulai itu dimatikan saat AsyncTask masih berjalan dan perlu memperbarui UI setelah selesai ... (yang tidak akan berfungsi karena Aktivitas sudah dihancurkan). Mengapa tidak menggunakan IntentService yang afaik Anda tidak perlu berhenti secara manual, karena itu hanya berakhir setelah selesai?
AgentKnopf
poin bagus. Penjelasan yang baik tentang layanan. Itu adalah layanan berjalan di latar belakang terus menerus bahkan pekerjaan dilakukan.
BABU K
3
@ LarsH Perbaiki saya jika saya salah, tapi saya pikir Anda bisa menggunakan BroadcastReceiver di Aktivitas / Fragmen Anda dan dari IntentService, Anda cukup menyalakan Broadcast setelah selesai. Karena Anda dapat mendaftar ulang untuk Siaran atas Kegiatan / pembuatan ulang Fragmen yang seharusnya Anda liput. Alternatif lain akan menggunakan EventBus untuk memperbarui UI (meskipun saya mencoba untuk menghindari itu - membuat kode lebih sulit untuk mengikuti imo).
AgentKnopf
58

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 AsyncTaskadalah 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 AsyncTaskobjek!

Sherif elKhatib
sumber
2
Layanan digambarkan sebagai berjalan di latar belakang, terus berlanjut bahkan ketika aplikasi Anda ditutup. AsyncTask juga digunakan untuk melakukan sesuatu di latar belakang. Tahu apa yang saya maksud?
erikbwork
1
ya tetapi layanan mungkin atau mungkin tidak melakukan sesuatu. Mereka adalah OBYEK jangka panjang
Sherif elKhatib
"Layanan mungkin memiliki objek AsyncTask!" Terima kasih telah menunjukkannya. Tetapi apakah itu ide yang bagus - apakah ini sesuatu yang akan Anda rekomendasikan? Atau lebih baik menggunakan teknik threading yang lebih mendasar dalam suatu layanan?
RenniePet
"Aktivitas Anda mengikat ke layanan" belum tentu.
JacksOnF1re
@ JacksOnF1re Saya tahu ini seperti ketika saya pertama kali mulai coding: p tetapi "Aktivitas Anda mengikat ke layanan" adalah pernyataan yang benar. Saya juga bisa mengikat ke layanan ini. Kulkas juga bisa mengikat. Ini tidak membuat pernyataan tidak valid .. toh jk
Sherif elKhatib
7

Serviceadalah 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, dll

AsyncTaskdi 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 dll

arjun
sumber
dapatkah Anda menjelaskan mengapa menurut Anda jawaban Anda menambah sesuatu pada pertanyaan?
erikbwork
2
jawaban lain terlalu pendek atau terlalu panjang untuk dipahami oleh pemula. jadi saya menjawab dengan kata-kata sederhana dengan contoh
arjun
6

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

Ashana.Jackol
sumber
1
Hai Ashana, dapatkah saya bertanya mengapa Anda memberikan jawaban ini untuk pertanyaan yang sudah dijawab? Apakah Anda tidak puas dengan jawaban yang ditandai yang ada? Atau apakah Anda mencoba membangun profil SO dengan menuliskan pendapat Anda untuk semua pertanyaan yang ingin Anda sampaikan? Atau sesuatu yang sama sekali berbeda? Tidak bisa mengetahuinya, tapi saya melihat pola itu cukup sering belakangan ini.
erikbwork
3
ya saya tahu jawaban sudah diberikan dan saya tidak melihat banyak masalah di sini jika saya memberikan jawaban yang benar atau pendapat saya di sini bro? karena Anda bukan satu-satunya yang mencari jawaban untuk pertanyaan yang sama, jika seseorang sulit memahami solusi dalam jawaban di atas, ia dapat menggulir ke bawah untuk mencari jawaban yang cocok untuk mereka, mudah memahaminya. Terima kasih untuk kawan komentar, saya bukan jenius atau pro dalam pemrograman, hanya ingin membantu orang lain, cobalah untuk mengajar orang lain apa yang sudah saya ketahui :)
Ashana.Jackol
1

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.

sayem siam
sumber
1

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 tertentu Servicesubclass (mis. IntentService, JobService) akan diabaikan di sini.)

Proses Seumur Hidup

A Servicemewakili, untuk OS, "keinginan aplikasi untuk melakukan operasi yang berjalan lebih lama sementara tidak berinteraksi dengan pengguna" [ ref ].

Saat Anda Servicemenjalankan, Android memahami bahwa Anda tidak ingin proses Anda terbunuh. Ini juga benar setiap kali Anda memiliki Activitylayar, 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 ].

AsyncTasksjangan 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 sebabnya Servicesterdaftar di OS, dan AsyncTaskstidak.

Multithreading

AsyncTasks semua tentang membuat utas latar untuk melakukan pekerjaan, dan kemudian mempresentasikan hasil pekerjaan itu ke utas UI dengan cara yang aman.

Setiap AsyncTaskeksekusi baru umumnya menghasilkan lebih banyak konkurensi (lebih banyak utas), tergantung pada batasan dari AsyncTasks'skumpulan utas [ ref ].

Servicemetode, di sisi lain, selalu dipanggil pada utas UI [ ref ]. Hal ini berlaku untuk onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), dll Jadi, dalam arti, Servicestidak "lari" di latar belakang. Begitu mereka mulai ( onCreate()), mereka hanya "duduk" di sana - sampai tiba waktunya untuk membersihkan, mengeksekusi onStartCommand(), dll.

Dengan kata lain, menambahkan tambahan Servicestidak 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 / AsyncTaskdi Service.onCreate(), misalnya. Tetapi tidak semua kasus penggunaan memerlukan ini. Sebagai contoh:

  • Anda mungkin ingin terus Servicemenjalankannya sehingga Anda dapat terus mendapatkan pembaruan lokasi di "latar belakang" (artinya, tanpa harus memiliki Activitieslayar).
  • Atau, Anda mungkin ingin menjaga aplikasi tetap hidup hanya agar Anda dapat " BroadcastReceiverterdaftar " 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

Servicestidak berorientasi pada tugas. Mereka tidak diatur untuk "melakukan tugas" dan "memberikan hasil", seperti AsyncTasksjuga. Servicesjangan 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 AsyncTaskini dijadwalkan untuk bantahan . Tetapi itu tidak berarti Anda harus mengganti AsyncTasksdengan Anda Services! (Jika Anda telah belajar sesuatu dari jawaban ini, itu harus jelas.)

TL; DR

Servicessebagian besar ada di sana untuk "ada". Mereka seperti di luar layar Activity, memberikan alasan bagi aplikasi untuk tetap hidup, sementara komponen lain mengurus melakukan "pekerjaan". AsyncTasksmelakukan "pekerjaan", tetapi mereka tidak akan, dalam dan dari diri mereka sendiri, menjaga proses tetap hidup.

greeble31
sumber