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
DDDoriginal
2025-01-05 08:06:401054parcourir

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);
    }
}

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
            }
        });
    }
});

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
    });
});

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!

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