Saya mengembangkan aplikasi di mana saya perlu memperbarui beberapa info setiap kali pengguna masuk ke sistem, saya juga menggunakan database di telepon. Untuk semua operasi itu (pembaruan, mengambil data dari db, dll.) Saya menggunakan tugas async. Sampai sekarang saya tidak melihat mengapa saya tidak boleh menggunakannya, tetapi baru-baru ini saya mengalami bahwa jika saya melakukan beberapa operasi, beberapa tugas asinkron saya hanya berhenti pada pra-eksekusi dan tidak melompat ke doInBackground. Itu terlalu aneh untuk dibiarkan seperti itu, jadi saya mengembangkan aplikasi sederhana lain hanya untuk memeriksa apa yang salah. Dan cukup aneh, saya mendapatkan perilaku yang sama ketika jumlah total tugas async mencapai 5, yang keenam berhenti pada pra-eksekusi.
Apakah android memiliki batasan asyncTasks pada Aktivitas / Aplikasi? Atau hanya beberapa bug dan harus dilaporkan? Apakah ada yang mengalami masalah yang sama dan mungkin menemukan solusi untuk itu?
Ini kodenya:
Cukup buat 5 utas tersebut untuk bekerja di latar belakang:
private class LongAsync extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
isRunning = true;
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
while (isRunning)
{
}
return null;
}
@Override
protected void onPostExecute(String result)
{
Log.d("TestBug","onPostExecute");
}
}
Dan kemudian buat utas ini. Ini akan masuk ke preExecute dan hang (tidak akan masuk ke doInBackground).
private class TestBug extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
waiting = new ProgressDialog(TestActivity.this);
waiting.setMessage("Loading data");
waiting.setIndeterminate(true);
waiting.setCancelable(true);
waiting.show();
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
return null;
}
@Override
protected void onPostExecute(String result)
{
waiting.cancel();
Log.d("TestBug","onPostExecute");
}
}
sumber
core pool size
ataumaximum pool size
?@antonyt memiliki jawaban yang benar tetapi jika Anda mencari solusi sederhana maka Anda dapat memeriksa Needle.
Dengan itu Anda dapat menentukan ukuran kumpulan utas khusus dan, tidak seperti
AsyncTask
, ini berfungsi pada semua versi Android yang sama. Dengannya Anda dapat mengatakan hal-hal seperti:atau hal-hal seperti itu
Ia dapat melakukan lebih banyak lagi. Lihat di GitHub .
sumber
Pembaruan : Sejak API 19, ukuran kumpulan utas inti diubah untuk mencerminkan jumlah CPU pada perangkat, dengan minimum 2 dan maksimum 4 pada awalnya, sambil berkembang ke maksimum CPU * 2 +1 - Referensi
Perhatikan juga bahwa meskipun eksekutor default AsyncTask adalah serial (menjalankan satu tugas pada satu waktu dan dalam urutan kedatangannya), dengan metode
Anda dapat menyediakan Pelaksana untuk menjalankan tugas Anda. Anda dapat memberikan THREAD_POOL_EXECUTOR sebagai pelaksana di bawah tenda tetapi tanpa serialisasi tugas, atau Anda bahkan dapat membuat Pelaksana Anda sendiri dan menyediakannya di sini. Namun, perhatikan dengan cermat peringatan di Javadocs.
Satu hal lagi yang perlu diperhatikan adalah bahwa kerangka kerja yang disediakan Pelaksana THREAD_POOL_EXECUTOR dan versi serinya SERIAL_EXECUTOR (yang merupakan default untuk AsyncTask) bersifat statis (konstruksi tingkat kelas) dan karenanya dibagikan di semua instance AsyncTask (s) di seluruh proses aplikasi Anda.
sumber