Maison >Java >javaDidacticiel >Quels sont les remplacements appropriés pour AsyncTask dans Android 11 et comment puis-je migrer mon code AsyncTask existant pour les utiliser, en ciblant minSdkVersion 16 ?

Quels sont les remplacements appropriés pour AsyncTask dans Android 11 et comment puis-je migrer mon code AsyncTask existant pour les utiliser, en ciblant minSdkVersion 16 ?

DDD
DDDoriginal
2024-12-15 07:18:14286parcourir

What are the suitable replacements for AsyncTask in Android 11 and how can I migrate my existing AsyncTask code to use them, targeting minSdkVersion 16?

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=&quot;https://developer.android.com/topic/libraries/architecture/coroutines&quot;>
 *   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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn