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?
Il existe de nombreuses alternatives AsyncTask:
and plus Needle - Bibliothèque de multithreading pour Android
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.
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 .
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() {}
}
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.