Saya memiliki AsyncTask
kelas yang saya jalankan yang mengunduh daftar besar data dari situs web.
Jika pengguna akhir memiliki koneksi data yang sangat lambat atau tidak stabil pada saat penggunaan, saya ingin membuat AsyncTask
batas waktu setelah jangka waktu tertentu. Pendekatan pertama saya untuk ini adalah seperti ini:
MyDownloader downloader = new MyDownloader();
downloader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( downloader.getStatus() == AsyncTask.Status.RUNNING )
downloader.cancel(true);
}
}, 30000 );
Setelah memulai AsyncTask
, penangan baru dimulai yang akan membatalkan AsyncTask
setelah 30 detik jika masih berjalan.
Apakah ini pendekatan yang bagus? Atau adakah sesuatu yang dibangun di dalamnya AsyncTask
yang lebih cocok untuk tujuan ini?
java
android
android-asynctask
Jake Wilson
sumber
sumber
Jawaban:
Ya, ada AsyncTask.get ()
Perhatikan bahwa dengan memanggil ini di thread utama (AKA. UI thread) akan memblokir eksekusi, Anda mungkin perlu memanggilnya di thread terpisah.
sumber
handler
pendekatan yang saya jelaskan dalam pertanyaan saya? Tampak jauh lebih mudah karena utas UI tidak membeku saat menunggu untuk menjalankan Handler's Runnable ...Dalam kasus ini, pengunduh Anda didasarkan pada untuk sambungan URL, Anda memiliki sejumlah parameter yang dapat membantu Anda menentukan batas waktu tanpa kode kompleks:
Jika Anda hanya membawa kode ini ke tugas asinkron Anda, tidak apa-apa.
'Read Timeout' adalah untuk menguji jaringan yang buruk selama proses transfer.
'Connection Timeout' hanya dipanggil di awal untuk menguji apakah server sudah aktif atau tidak.
sumber
Gunakan Kelas CountDownTimer di samping kelas yang diperluas untuk AsyncTask dalam metode onPreExecute ():
Keuntungan utama, pemantauan Async dilakukan secara internal di dalam kelas.
ubah CountDownTimer (7000, 7000) -> CountDownTimer (7000, 1000) misalnya dan itu akan memanggil onTick () 6 kali sebelum memanggil onFinish (). Ini bagus jika Anda ingin menambahkan beberapa pemantauan.
Terima kasih atas semua saran bagus yang saya dapatkan di halaman ini :-)
sumber
Saya tidak berpikir ada hal seperti itu yang dibangun ke dalam AsyncTask. Pendekatan Anda tampaknya bagus. Pastikan untuk memeriksa nilai isCancelled () secara berkala dalam metode doInBackground AsyncTask Anda untuk mengakhiri metode ini setelah thread UI membatalkannya.
Jika Anda ingin menghindari penggunaan penangan karena alasan tertentu, Anda dapat memeriksa System.currentTimeMillis secara berkala di dalam AsyncTask Anda dan keluar saat waktu tunggu, meskipun saya lebih menyukai solusi Anda karena ini benar-benar dapat mengganggu utas.
sumber
sumber
Anda dapat menempatkan satu ketentuan lagi untuk membuat pembatalan lebih kuat. misalnya,
sumber
Menginspirasi dari pertanyaan saya telah menulis sebuah metode yang melakukan beberapa tugas latar belakang melalui AsyncTask dan jika pemrosesan membutuhkan waktu lebih dari LOADING_TIMEOUT maka dialog peringatan untuk mencoba lagi akan muncul.
sumber