API AsyncTask obsolète dans Android 11 : quelles sont les alternatives ?
Google a annoncé qu'il rendrait obsolète l'API Android AsyncTask dans Android 11 et recommande d'utiliser java.util.concurrent à la place. Vous pouvez consulter les informations de validation ici :
* @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> {
Si vous conservez une ancienne base de code qui utilise des tâches asynchrones dans Android, il est probable que vous devrez la modifier à l'avenir. Ma question est la suivante : comment puis-je remplacer correctement l'extrait de code présenté ci-dessous par java.util.concurrent. Il s’agit d’une classe interne statique d’Activité. Je recherche une solution qui fonctionne dans minSdkVersion 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) ; } }
Alternative :
Vous pouvez utiliser directement les exécuteurs du package java.util.concurrent.
J'ai également recherché des informations en ligne et trouvé une solution dans l'article suivant : L'API Android Async est obsolète.
Malheureusement, l'article est écrit en Kotlin mais après quelques efforts je l'ai converti en Java. Voici donc la solution ci-dessous.
ExecutorService executor = Executors.newSingleThreadExecutor(); Handler handler = new Handler(Looper.getMainLooper()); executor.execute(new Runnable() { @Override public void run() { //Background work here handler.post(new Runnable() { @Override public void run() { //UI Thread work here } }); } });
N'est-ce pas très simple ? Si vous utilisez Java 8 dans votre projet, vous pouvez le simplifier encore davantage.
ExecutorService executor = Executors.newSingleThreadExecutor(); Handler handler = new Handler(Looper.getMainLooper()); executor.execute(() -> { //Background work here handler.post(() -> { //UI Thread work here }); });
Pourtant, il ne bat pas Kotlin en termes de code concis, mais il est meilleur que les versions Java précédentes.
J'espère que cela vous aidera. Merci!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!