AsyncTaskLoader vs AsyncTask

129

Karena Honeycombdan v4 Compatibility Libraryitu mungkin untuk digunakan AsyncTaskLoader. Dari apa yang saya mengerti, AsyncTaskLoaderdapat bertahan melalui perubahan konfigurasi seperti membalik layar.

Apakah dianjurkan untuk menggunakan AsyncTaskLoaderbukan AsyncTask? Apakah LoaderManagermasuk dalam gambar juga?

Tapi saya belum menemukan contoh yang bagus tentang cara menggunakan dengan benar AsyncTaskLoader. Dokumen juga tidak memberikan contoh. Adakah yang bisa memberikan beberapa contoh yang baik.

OKA
sumber

Jawaban:

51

Anda dapat melihat kode sumber perpustakaan kompatibilitas untuk mendapatkan info lebih lanjut. Apa yang FragmentActivitydilakukan adalah:

  • simpan daftar LoaderManager's
  • pastikan mereka tidak hancur ketika Anda membalik telepon Anda (atau perubahan konfigurasi lain terjadi) dengan menyimpan instance menggunakan onRetainNonConfigurationInstance()
  • tendang pemuat kanan saat Anda menelepon initLoader()di Aktivitas Anda

Anda perlu menggunakan LoaderManagerantarmuka untuk dengan loader, dan memberikan panggilan balik yang diperlukan untuk membuat loader Anda dan mengisi pandangan Anda dengan data yang mereka kembalikan.

Umumnya itu harus lebih mudah daripada mengelola AsyncTasksendiri. Namun, AsyncTaskLoadertidak didokumentasikan dengan baik, jadi Anda harus mempelajari contoh dalam dokumen dan / atau memodelkan kode Anda setelah CursorLoader.

Nikolay Elenkov
sumber
5
Saya akan melihat ini. Mungkin terlalu dini untuk menemukan contoh yang bagus AsyncTaskLoader, dan ketika lebih banyak pengembang mulai menggunakannya, lebih banyak contoh akan datang.
OKA
47

Ketika membandingkan AsyncTaskLoader vs. AsyncTask , seperti yang Anda ketahui ketika Anda memutar layar perangkat Anda, itu dapat menghancurkan dan menciptakan kembali aktivitas Anda, untuk membuatnya jelas biarkan gambar memutar perangkat Anda saat transaksi jaringan sedang berlangsung:

AsyncTask akan dieksekusi kembali sebagai utas latar lagi, dan pemrosesan utas latar sebelumnya hanya menjadi berlebihan dan zombie.

AsyncTaskLoader hanya akan digunakan kembali berdasarkan ID Loader yang terdaftar di Loader Manager sebelumnya, jadi hindari menjalankan kembali transaksi jaringan.

Singkatnya, AsyncTaskLoader mencegah duplikasi utas latar dan menghilangkan duplikasi kegiatan zombie.

Hoang Duc Dong
sumber
11

AsyncTaskLoader melakukan fungsi yang sama dengan AsyncTask , tetapi sedikit lebih baik. Ia dapat menangani perubahan konfigurasi Aktivitas dengan lebih mudah, dan berperilaku dalam siklus hidup Fragmen dan Aktivitas. Yang menyenangkan adalah bahwa AsyncTaskLoader dapat digunakan dalam situasi apa pun yang digunakan AsyncTask. Kapan saja data perlu dimuat ke dalam memori untuk ditangani oleh Activity / Fragment, AsyncTaskLoader dapat melakukan pekerjaan dengan lebih baik.

Ada beberapa masalah dengan menggunakan AsyncTasks, meskipun:

  • Perubahan konfigurasi dapat mengacaukan segalanya
  • Menjeda suatu kegiatan tidak menghentikan AsyncTask
  • Sejumlah kode boilerplate (yang berarti lebih banyak kemungkinan kesalahan)

AsyncTaskLoader doc

Attif
sumber
8

Beberapa perbedaan selain dijelaskan dalam jawaban lain:

Saat menggunakan AsyncTaskLoader di atas AsyncTask :

  • AsyncTaskLoader memberi kami kebebasan untuk memuat data cache lama sampai data baru dikembalikan olehforceLoad()

  • Kita dapat mengatur penundaan untuk AsyncTaskLoader oleh setUpdateThrottle()yang dapat mencegah update berturut-turut kepada klien (Activity / Fragmen)

  • AsyncTaskLoader dapat dibagikan ke beberapa fragmen jika mereka memiliki aktivitas induk yang sama dan jika itu dimulai darigetActivity().getSupportLoaderManager()

  • AsyncTaskLoader dihancurkan LoaderMangerketika aktivitas tertautnya tidak tersedia lagi. sementara kita perlu menghancurkan AsyncTasks secara manual jika aktivitas pemanggilnya menghancurkan. Ini menghemat waktu kita dari menulis semua hal kliring. AsyncTaskLoader bermain dengan baik dengan siklus hidup masing-masing.

Jadi, AsyncTaskLoader jauh lebih baik daripada AsyncTask.

Palak Darji
sumber