Asynctask vs Thread di android

137

Di UI, untuk melakukan beberapa pekerjaan latar belakang, saya menggunakan file Thread. Tetapi seperti yang disarankan oleh orang lain, saya sekarang menggunakan AsyncTask.

Apa perbedaan utama antara a Threaddan an AsyncTask?

Dalam skenario mana, saya harus menggunakan file Thread atau an AsyncTask?

Ram
sumber
@ webaldo.at Saya mereferensikan ini, di sini mereka diberikan deskripsi enter dan perbedaan antara Asynctask dan Thread. Saya ingin tahu kasus mana misalnya koneksi jaringan, file yang dibaca untuk itu apa yang saya gunakan ?.
Ram
Dipersingkat: Thread -> Tidak Ada Akses ke UI-Thread || Asynctask -> Akses Bersyarat ke UI-Thread
JavaDM
untuk tugas latar belakang IntentService adalah pilihan bagus lainnya.
Chen
1
Kemungkinan duplikat Handler vs AsyncTask vs Thread
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

148

Untuk tugas yang berjalan lama atau banyak menggunakan CPU, pada dasarnya ada dua cara untuk melakukannya: utas Java, dan AsyncTask bawaan Android.

Tidak ada yang lebih baik dari yang lain, tetapi mengetahui kapan harus menggunakan setiap panggilan penting untuk meningkatkan kinerja sistem untuk keuntungan Anda.

Gunakan AsyncTask untuk:

  1. Operasi jaringan sederhana yang tidak memerlukan banyak pengunduhan data
  2. Tugas terikat disk yang mungkin memerlukan waktu lebih dari beberapa milidetik

Gunakan utas Java untuk:

  1. Operasi jaringan yang melibatkan data dalam jumlah sedang hingga besar (baik mengunggah atau mengunduh)
  2. Tugas CPU tinggi yang perlu dijalankan di latar belakang
  3. Tugas apa pun di mana Anda ingin mengontrol penggunaan CPU relatif terhadap utas GUI

Dan ada banyak sumber daya bagus melalui internet yang dapat membantu Anda:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

Mohit
sumber
Bolehkah saya bertanya mengapa jumlah data unduhan menjadi masalah?
Yeung
1
@Yeung Sepertinya Anda membutuhkan wawasan tentang Tugas Asinkron! Lihat, lebih besar jumlah data maka jelas lebih besar waktu yang dibutuhkan untuk menyelesaikan operasi yang sama. Oleh karena itu, bukan praktik yang baik untuk melakukan proses yang berjalan lama menggunakan Tugas Async karena alasan berikut: 1. Tugas Asinkron tidak terikat dengan baik ke siklus hidup Aktivitas. 2. Mereka membuat kebocoran meomory.
Mohit
Terima kasih. Saya mengerti risikonya sekarang.
Yeung
@Impasse @Yeung IMO jumlah data tidak menjadi masalah, masalah utama dengan operasi jaringan itu waktu operasi. Bahkan mengunduh beberapa byte mungkin membutuhkan waktu lama, ketika server sibuk, tidak dapat dijangkau (batas waktu) dll. Perbaikan dapat digunakan AsyncTaskdengan penjadwal sendiri.
xmedeko
44

Jika Anda menggunakan thread Java, Anda harus menangani persyaratan berikut dalam kode Anda sendiri:

Sinkronisasi dengan utas utama jika Anda memposting kembali hasil ke antarmuka pengguna

Tidak ada default untuk membatalkan utas

Tidak ada penggabungan utas default

Tidak ada default untuk menangani perubahan konfigurasi di Android

Tarun Varshney
sumber
3
ini sebenarnya lebih menjelaskan karena menangani alasan mengapa tidak menggunakan Threads sederhana. Dari pemikiran saya, apa pun yang perlu dikaitkan dengan siklus hidup Aktivitas / Layanan harus menggunakan AsyncTask sebagai gantinya, meskipun Anda perlu secara manual "menurunkan" sumber daya di dalam tugas, setidaknya Anda tidak berakhir dengan tugas yang menggantung saat aktivitas dimatikan.
leRobot
28

Benang

  • Tugas panjang pada umumnya
  • Panggil dengan metode thread.start ()
  • Dipicu dari utas mana pun
  • Berjalan di atasnya sendiri
  • Manajemen / kode utas manual mungkin menjadi sulit untuk dibaca

AsyncTask

  • Tugas kecil harus berkomunikasi dengan utas utama
  • Panggil dengan metode excute ()
  • Dipicu dari utas utama
  • Berjalan di thread pekerja
  • Harus dijalankan dan dibuat dari utas utama
Umang Kothari
sumber
Saya tidak bisa memahami Runs on its own threadvs Runs on worker thread? apa perbedaan antara thread Own dan thread pekerja?
imany apk
11

Benang

Utas adalah unit eksekusi serentak. Ini memiliki tumpukan panggilannya sendiri. Ada dua metode untuk mengimplementasikan utas dalam aplikasi.

Salah satunya adalah menyediakan kelas baru yang memperluas Thread dan mengganti metode run () -nya. Yang lainnya menyediakan instance Thread baru dengan objek Runnable selama pembuatannya. Sebuah utas dapat dieksekusi dengan memanggil metode "mulai". Anda dapat menyetel "Prioritas" utas dengan memanggil metode "setPriority (int)".

Sebuah utas dapat digunakan jika Anda tidak memiliki pengaruh di bagian UI. Misalnya, Anda memanggil beberapa layanan web atau mengunduh beberapa data, dan setelah mengunduh, Anda menampilkannya ke layar Anda. Kemudian Anda perlu menggunakan Handler dengan Thread dan ini akan membuat aplikasi Anda menjadi rumit untuk menangani semua respons dari Threads.

Handler memungkinkan Anda mengirim dan memproses objek Message dan Runnable yang terkait dengan MessageQueue dari thread. Setiap utas memiliki antrian pesan masing-masing. (Seperti To do List), dan utas akan mengambil setiap pesan dan memprosesnya hingga antrian pesan kosong. Jadi, ketika Handler berkomunikasi, itu hanya memberikan pesan ke thread pemanggil dan itu akan menunggu untuk diproses.

Jika Anda menggunakan thread Java, maka Anda perlu menangani persyaratan berikut dalam kode Anda sendiri:

Sinkronisasi dengan thread utama jika Anda memposting kembali hasil ke antarmuka pengguna Tidak ada default untuk membatalkan thread Tidak ada penggabungan thread default Tidak ada default untuk menangani perubahan konfigurasi di Android

AsyncTask

AsyncTask memungkinkan penggunaan thread UI dengan benar dan mudah. Kelas ini memungkinkan melakukan operasi latar belakang dan menerbitkan hasil pada UI thread tanpa harus memanipulasi thread dan / atau penangan. Tugas asinkron ditentukan oleh komputasi yang berjalan pada thread latar belakang dan yang hasilnya dipublikasikan di thread UI.

AsyncTask akan melalui 4 tahap berikut:

onPreExecute ()

Dipanggil di thread UI sebelum tugas dijalankan

doInbackground (Params ..)

Dipanggil di thread latar belakang segera setelah onPreExecute () selesai dijalankan.

onProgressUpdate (Progress ..)

Dipanggil pada thread UI setelah panggilan ke publishProgress (Progress ...).

onPostExecute (Hasil)

Dipanggil pada thread UI setelah komputasi latar belakang selesai.

Mengapa Anda harus menggunakan AsyncTask?

Mudah digunakan untuk UI Thread. (Jadi, gunakan jika utas pemanggil adalah utas UI).

Tidak perlu memanipulasi Penangan.

Untuk informasi lebih lanjut kunjungi Disini

Vipul Purohit
sumber
2

Benang:

Threadharus digunakan untuk memisahkan operasi yang berjalan lama dari utas utama sehingga kinerja ditingkatkan. Tetapi itu tidak dapat dibatalkan dengan elegan dan tidak dapat menangani perubahan konfigurasi Android. Anda tidak dapat memperbarui UI dari Thread.

AsyncTaskdapat digunakan untuk menangani item pekerjaan yang durasinya kurang dari 5ms. Dengan AsyncTask, Anda dapat memperbarui UI tidak seperti java Thread. Tetapi banyak tugas yang berjalan lama akan menghambat kinerja.

Anda memiliki lebih sedikit alternatif untuk keduanya.

HandlerThread / Handler dan ThreadPoolExecutor

Lihat posting di bawah ini untuk lebih jelasnya:

Penangan vs AsyncTask vs Thread

Ravindra babu
sumber