EDIT : Pertanyaan ini bukan duplikat sebagai
- Hanya beberapa hari yang lalu AOSP berkomitmen pada penghentian telah dilakukan.
- Pertanyaan lain adalah tentang menggunakan AsyncTaskLoader di atas AsyncTask.
Google mencela Android AsyncTask API di Android 11 dan menyarankan untuk menggunakannya java.util.concurrent
sebagai gantinya. Anda dapat melihat komit di sini
*
* @deprecated Use the standard <code>java.util.concurrent</code> or
* <a href="https://developer.android.com/topic/libraries/architecture/coroutines">
* Kotlin concurrency utilities</a> instead.
*/
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {
Jika Anda mempertahankan basis kode yang lebih lama dengan tugas-tugas tidak sinkron di Android, Anda mungkin harus mengubahnya di masa mendatang. Pertanyaan saya adalah apa yang seharusnya menjadi pengganti yang tepat dari cuplikan kode yang ditunjukkan di bawah ini java.util.concurrent
. Ini adalah kelas dalam statis dari suatu Kegiatan. Saya mencari sesuatu yang akan berhasilminSdkVersion 16
private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> {
private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName();
private WeakReference<MyActivity> activityReference;
LongRunningTask(MyActivity context) {
activityReference = new WeakReference<>(context);
}
@Override
protected MyPojo doInBackground(String... params) {
// Some long running task
}
@Override
protected void onPostExecute(MyPojo data) {
MyActivity activity = activityReference.get();
activity.progressBar.setVisibility(View.GONE);
populateData(activity, data) ;
}
}
AsyncTask
tidak dapat dihapus tanpa merusak kompatibilitas.Jawaban:
Baguslah bahwa itu sudah usang, karena
WeakReference<Context>
selalu merupakan peretasan, dan bukan solusi yang tepat .Sekarang orang akan memiliki kesempatan untuk membersihkan kode mereka.
Berdasarkan kode ini,
Progress
sebenarnya tidak diperlukan, dan adaString
input +MyPojo
output.Ini sebenarnya cukup mudah dilakukan tanpa menggunakan AsyncTask.
Bagaimana cara melewati String? Seperti itu:
Dan
Contoh ini menggunakan kumpulan utas tunggal yang baik untuk penulisan DB (atau permintaan jaringan serial), tetapi jika Anda menginginkan sesuatu untuk DB dibaca atau beberapa permintaan, Anda dapat mempertimbangkan konfigurasi Pelaksana berikut:
sumber
executor.post
. Tidak dapat menyelesaikan metodeexecute()
bukanpost()
Context
ini? Saya tahu bahwa memasukkanContext
ke dalamAsyncTask
adalah salah satu masalahnya.newSingleThreadExecutor
lebih baik untuk menulis, tetapi Anda harus menggunakanTHREAD_POOL_EXECUTOR
di akhir posting untuk membaca database.Google merekomendasikan penggunaan kerangka kerja Java Concurrency atau Kotlin Coroutines. tetapi Rxjava akhirnya memiliki lebih banyak fleksibilitas dan fitur kemudian java concurrency sehingga memperoleh popularitas yang cukup tinggi.
sumber