Saya mencoba menulis aplikasi sederhana yang diperbarui. Untuk ini saya memerlukan fungsi sederhana yang dapat mengunduh file dan menunjukkan kemajuan saat ini dalam ProgressDialog
. Saya tahu bagaimana melakukan itu ProgressDialog
, tetapi saya tidak yakin bagaimana menampilkan kemajuan saat ini dan bagaimana cara mengunduh file di tempat pertama.
java
android
download
android-asynctask
Tom Leese
sumber
sumber
Jawaban:
Ada banyak cara untuk mengunduh file. Mengikuti Saya akan memposting cara yang paling umum; Terserah Anda untuk memutuskan metode mana yang lebih baik untuk aplikasi Anda.
1. Gunakan
AsyncTask
dan tunjukkan progres unduhan dalam dialogMetode ini akan memungkinkan Anda untuk menjalankan beberapa proses latar belakang dan memperbarui UI secara bersamaan (dalam hal ini, kami akan memperbarui bilah kemajuan).
Impor:
Ini adalah contoh kode:
The
AsyncTask
akan terlihat seperti ini:Metode di atas (
doInBackground
) selalu berjalan di utas latar belakang. Anda seharusnya tidak melakukan tugas UI di sana. Di sisi lain,onProgressUpdate
danonPreExecute
jalankan di utas UI, sehingga Anda dapat mengubah bilah kemajuan:Agar ini dapat berjalan, Anda memerlukan izin WAKE_LOCK.
2. Unduh dari Layanan
Pertanyaan besar di sini adalah: bagaimana cara saya memperbarui aktivitas saya dari suatu layanan? . Dalam contoh berikut kita akan menggunakan dua kelas yang mungkin tidak Anda sadari:
ResultReceiver
danIntentService
.ResultReceiver
adalah yang akan memungkinkan kami untuk memperbarui utas kami dari suatu layanan;IntentService
adalah subclassService
yang memunculkan thread untuk melakukan pekerjaan latar belakang dari sana (Anda harus tahu bahwaService
running sebenarnya di thread yang sama dari aplikasi Anda; ketika Anda meluasService
, Anda harus secara manual menelurkan thread baru untuk menjalankan operasi pemblokiran CPU).Layanan unduhan dapat terlihat seperti ini:
Tambahkan layanan ke manifes Anda:
Dan aktivitasnya akan terlihat seperti ini:
Ini dia
ResultReceiver
datang untuk bermain:2.1 Gunakan perpustakaan Groundy
Groundy adalah pustaka yang pada dasarnya membantu Anda menjalankan potongan kode di layanan latar belakang, dan didasarkan pada
ResultReceiver
konsep yang ditunjukkan di atas. Perpustakaan ini sudah usang saat ini. Beginilah keseluruhan kode akan terlihat seperti:Aktivitas tempat Anda menampilkan dialog ...
Sebuah
GroundyTask
implementasi digunakan oleh Groundy untuk men-download file dan menunjukkan kemajuan:Dan tambahkan ini ke manifes:
Tidak mungkin lebih mudah menurutku. Ambil saja toples terbaru dari Github dan Anda siap berangkat. Perlu diingat bahwa tujuan utama Groundy adalah untuk membuat panggilan ke apek REST eksternal dalam layanan latar belakang dan memposting hasil ke UI dengan mudah. Jika Anda melakukan hal seperti itu di aplikasi Anda, itu bisa sangat berguna.
2.2 Gunakan https://github.com/koush/ion
3. Gunakan
DownloadManager
kelas (GingerBread
dan yang lebih baru saja)GingerBread membawa fitur baru
DownloadManager
,, yang memungkinkan Anda mengunduh file dengan mudah dan mendelegasikan kerja keras menangani utas, stream, dll. Ke sistem.Pertama, mari kita lihat metode utilitas:
Nama metode menjelaskan semuanya. Setelah yakin
DownloadManager
tersedia, Anda dapat melakukan sesuatu seperti ini:Kemajuan unduhan akan ditampilkan di bilah notifikasi.
Pikiran terakhir
Metode pertama dan kedua hanyalah puncak gunung es. Ada banyak hal yang harus diingat jika Anda ingin aplikasi Anda menjadi kuat. Berikut daftar singkatnya:
INTERNET
danWRITE_EXTERNAL_STORAGE
); jugaACCESS_NETWORK_STATE
jika Anda ingin memeriksa ketersediaan internet.Kecuali jika Anda memerlukan kontrol terperinci dari proses unduhan, maka pertimbangkan untuk menggunakan
DownloadManager
(3) karena sudah menangani sebagian besar item yang tercantum di atas.Tetapi juga pertimbangkan bahwa kebutuhan Anda dapat berubah. Misalnya,
DownloadManager
tidak ada caching respons . Ini akan membabi buta mengunduh file besar yang sama beberapa kali. Tidak ada cara mudah untuk memperbaikinya setelah fakta. Di mana jika Anda mulai dengan dasarHttpURLConnection
(1, 2), maka yang Anda butuhkan adalah menambahkanHttpResponseCache
. Jadi upaya awal mempelajari alat dasar dan standar dapat menjadi investasi yang baik.sumber
close()
stream (input
danoutput
) difinally
alih-alihtry
, jika tidak ada pengecualian yang dilemparkan sebelumnyaclose()
, Anda memiliki stream tertutup yang berkeliaran.sdcard/
gunakanEnvironment.getExternalStorageDirectory()
saja.Jangan lupa untuk menambahkan izin ke file manifes Anda jika Anda akan mengunduh hal-hal dari internet!
sumber
Ya kode di atas akan bekerja .Tapi jika Anda memperbarui Anda
progressbar
dionProgressUpdate
dariAsynctask
dan Anda menekan tombol kembali atau menyelesaikan aktivitas AndaAsyncTask
kehilangan track dengan Anda UI .Dan ketika Anda kembali ke aktivitas Anda, bahkan jika download sedang berjalan di latar belakang Anda akan melihat tidak ada pembaruan di progressbar. Jadi,OnResume()
cobalah menjalankan utas sepertirunOnUIThread
dengan tugas pengatur waktu yang memutakhirkan ur Andaprogressbar
dengan pembaruan nilai dariAsyncTask
latar belakang yang berjalan.Jangan lupa Hancurkan utas saat aktivitas Anda tidak terlihat.
sumber
Saya akan merekomendasikan Anda untuk menggunakan Project Netroid saya , ini berdasarkan Volley . Saya telah menambahkan beberapa fitur untuk itu seperti panggilan balik multi-peristiwa, manajemen unduhan file. Ini bisa membantu.
sumber
SSLSocketFactory
menambahkan Anda sendiriHostnameVerifier
tidak mungkin dan saya perlu verifikasi tersebut. Mengangkat masalah tentang itu.Saya telah memodifikasi
AsyncTask
kelas untuk menangani pembuatanprogressDialog
pada konteks yang sama. Saya pikir kode berikut akan lebih dapat digunakan kembali. (dapat dipanggil dari aktivitas apa pun hanya lewat konteks, File target, pesan dialog)sumber
Jangan lupa ganti "/ sdcard ..." dengan File baru ("/ mnt / sdcard / ...") jika tidak, Anda akan mendapatkan FileNotFoundException
sumber
Environment.getExternalStorageDirectory().getAbsolutePath()
untuk mendapatkan jalur ke sdcard. Juga jangan lupa untuk memeriksa apakah penyimpanan eksternal sudah terpasang -Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
( Mannaz )Saya menemukan posting blog ini sangat membantu, menggunakan loopJ untuk mengunduh file, hanya memiliki satu fungsi sederhana, akan sangat membantu untuk beberapa orang android baru.
sumber
Sementara saya mulai belajar pengembangan android, saya telah belajar bahwa itu
ProgressDialog
adalah cara untuk pergi. AdasetProgress
metodeProgressDialog
yang dapat digunakan untuk memperbarui tingkat kemajuan saat file diunduh.Yang terbaik yang saya lihat di banyak aplikasi adalah mereka menyesuaikan atribut dialog progres ini untuk memberikan tampilan dan nuansa yang lebih baik untuk dialog progres daripada versi stok. Baik untuk menjaga pengguna terlibat dengan beberapa animasi seperti katak, gajah atau kucing / anak anjing yang lucu. Animasi apa pun dengan dialog progres menarik pengguna dan mereka merasa tidak ingin menunggu lama.
sumber
Saran pribadi saya adalah menggunakan Dialog Kemajuan dan membangun sebelum eksekusi, atau memulai pada
OnPreExecute()
, sering mempublikasikan kemajuan jika Anda menggunakan gaya horizontal dari progress bar dari dialog progres. Bagian yang tersisa adalah untuk mengoptimalkan algoritmadoInBackground
.sumber
Gunakan pustaka Android Query, memang sangat keren. Anda dapat mengubahnya untuk digunakan
ProgressDialog
seperti yang Anda lihat dalam contoh lain, yang ini akan menampilkan tampilan progres dari tata letak Anda dan menyembunyikannya setelah selesai.sumber
Saya menambahkan jawaban lain untuk solusi lain yang saya gunakan sekarang karena Android Query begitu besar dan tidak terawat untuk tetap sehat. Jadi saya pindah ke https://github.com/amitshekhariitbhu/Fast-Android-Networking ini .
sumber
Izin
Menggunakan HttpURLConnection
sumber
Anda dapat mengamati perkembangan pengelola unduhan menggunakan LiveData dan coroutine, lihat intinya di bawah ini
https://gist.github.com/FhdAlotaibi/678eb1f4fa94475daf74ac491874fc0e
sumber
Penting
AsyncTask tidak digunakan lagi di Android 11.
Untuk informasi lebih lanjut, silakan cek posting berikut
Mungkin harus pindah ke Kerangka kerja konsorensi seperti yang disarankan oleh google
sumber
Kita bisa menggunakan coroutine dan work manager untuk mengunduh file di kotlin.
Tambahkan dependensi di build.gradle
Kelas WorkManager
Mulai mengunduh melalui manajer kerja di kelas aktivitas
sumber