web-dev-qa-db-fra.com

Android: Alternatives à AsyncTask?

pour mon application, j'ai créé un cadre pour tous les appels réseau vers une API externe. J'ai tout mis dans "Services" comme: UserService, MessageService etc. Ainsi, maintenant, si je veux appeler une méthode réseau, je ne peux pas le faire dans le fil d'interface utilisateur de ma Activity alors j'ai créé une AsyncTask et tout s'est bien passé =)

Mais maintenant, je veux quelque chose comme donner la méthode à exécuter à la variable AsyncTask, de sorte que je n'ai pas besoin d'écrire une variable AsyncTask pour chaque méthode de mon infrastructure réseau. Donc au lieu d'avoir quelque chose comme ça:

public class NetworkTask extends AsyncTask<UserService, Void, Void> {

    @Override
    protected Void doInBackground(UserService... params) {
        UserService userService = params[0];
        userService.getUser();
        return null;
    }
}

Je veux quelque chose de plus "abstrait" pour que AsyncTask n'ait pas besoin de connaître la méthode "getUser"? Mais je ne trouve aucune idée de comment faire cela ... Peut-être que la tâche Async n'est pas bonne pour ça de toute façon?

11
cherry-wave

Il existe de nombreuses alternatives AsyncTask:

https://Android-arsenal.com/tag/9

and plus Needle - Bibliothèque de multithreading pour Android

http://zsoltsafrany.github.io/needle/

6
WebComer

Rappelez-vous qu'Android a une limite de threads et de tâches asynchrones.

Vous pouvez utiliser 2 bibliothèques pour effectuer le même travail avec AsyncTasks:

1) Volley -> http://www.androidhive.info/2014/05/Android-working-with-volley-library-1/

2) LoopJ -> http://loopj.com/Android-async-http/

METTRE À JOUR

Je recommande vraiment Retrofit 2 . http://square.github.io/retrofit/

Bonne chance dans votre choix.

Cordialement,

Uilton.

4
uiltonsantos

Vous pouvez peut-être utiliser une bibliothèque tierce telle que Retrofit Si vous travaillez avec des images, je vous suggère fortement picasso

4
SebastianGreen

Si vous ne préférez pas les bibliothèques tierces et préférez les bibliothèques simples, avec une bonne documentation et un bon support, Loaders est le meilleur choix. 

Pour notre plus grand plaisir, AsyncTaskLoader (sous-classe de Loaders) remplit la même fonction que AsyncTask, mais il est également plus performant et permet de gérer plus facilement les modifications de la configuration d'Activité. Le mieux, c'est qu'il se comporte bien dans le cycle de vie des fragments et des activités.

Pour plus d'informations et de sous-classes, veuillez vérifier ceci documentation .

2
Crawler

RxJAVA est la meilleure option

Une alternative à Asynctask pour appel de service Web, téléchargement de fichier, téléchargement de fichier: Librairie de réseautage rapide Android

Pour les autres cas, vous pouvez utiliser les méthodes suivantes: méthode

 Disposable d = Observable.fromCallable(new Callable<HashMap<String, String>>() {
            @Override
            public HashMap<String, String> call() throws Exception {
            // will run in background thread (same as doinBackground)
                return postParam;
            }
        })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<HashMap<String, String>>() {
                    @Override
                    public void accept(final HashMap<String, String> data) throws Exception {

        // will run in UI thread. write down code for on PostExecute
                    }

                });
    // write down code for on preExecute
        DisposableManager.add(d);

// dispose d'un objet

@Override
    protected void onDestroy() {
        super.onDestroy();
        DisposableManager.dispose();
    }
        // Dispose manager class


 import io.reactivex.disposables.CompositeDisposable;
    import io.reactivex.disposables.Disposable;

    public class DisposableManager {

        private static CompositeDisposable compositeDisposable;

        public static void add(Disposable disposable) {
            getCompositeDisposable().add(disposable);
        }

        public static void dispose() {
            getCompositeDisposable().dispose();
        }

        private static CompositeDisposable getCompositeDisposable() {
            if (compositeDisposable == null || compositeDisposable.isDisposed()) {
                compositeDisposable = new CompositeDisposable();
            }
            return compositeDisposable;
        }

        private DisposableManager() {}
    }
1
Rajesh Nasit

Les chargeurs doivent être utilisés au lieu d'utiliser directement les tâches asynchrones. Il existe des API Loader spécifiques pour des opérations spécifiques telles que l'exécution de transations dans une base de données sqlite, etc.

0
amarnathpatel