Maison > Java > javaDidacticiel > Comment puis-je remplacer efficacement AsyncTask par java.util.concurrent dans Android tout en conservant la compatibilité ascendante ?

Comment puis-je remplacer efficacement AsyncTask par java.util.concurrent dans Android tout en conservant la compatibilité ascendante ?

DDD
Libérer: 2025-01-05 08:06:40
original
1001 Les gens l'ont consulté

How Can I Effectively Replace AsyncTask with java.util.concurrent in Android while Maintaining Backward Compatibility?

Dépréciation de l'API AsyncTask dans Android 11 : alternative avec la concurrence Java

À l'approche d'Android 11, Google supprime progressivement l'API AsyncTask, conseillant aux développeurs adopter java.util.concurrent pour les opérations asynchrones. Ce changement soulève la question : comment pouvez-vous remplacer efficacement AsyncTask par java.util.concurrent tout en conservant la compatibilité avec l'API de niveau 16 et supérieur ?

Considérez l'extrait suivant de la classe interne statique d'une activité :

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);
    }
}
Copier après la connexion

Une solution viable consiste à exploiter les exécuteurs du package java.util.concurrent. Voici une implémentation Java basée sur une approche Kotlin trouvée dans une API Android Async est un article obsolète :

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
            }
        });
    }
});
Copier après la connexion

Pour les utilisateurs de Java 8, une version plus concise est disponible :

ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());

executor.execute(() -> {
    // Background work here
    handler.post(() -> {
        // UI Thread work here
    });
});
Copier après la connexion

Alors Java n'est peut-être pas à la hauteur de la brièveté de Kotlin, ces alternatives fournissent une solution viable pour les opérations asynchrones dans l'ère post-AsyncTask, garantissant la compatibilité avec le niveau API 16 appareils.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal