EDIT : Cette question n'est pas un doublon comme
- Il y a quelques jours à peine, l'AOSP s'est engagé sur la dépréciation.
- L'autre question concerne l'utilisation d'AsyncTaskLoader sur AsyncTask.
Google déconseille l'API Android AsyncTask dans Android 11 et suggère de l'utiliser à la java.util.concurrent
place. vous pouvez consulter le commit ici
*
* @deprecated Use the standard <code>java.util.concurrent</code> or
* <a href="https://developer.android.com/topic/libraries/architecture/coroutines">
* Kotlin concurrency utilities</a> instead.
*/
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {
Si vous conservez une base de code plus ancienne avec des tâches asynchrones dans Android, vous devrez probablement la modifier à l'avenir. Ma question est que ce qui devrait être un remplacement correct de l'extrait de code ci-dessous en utilisant java.util.concurrent
. Il s'agit d'une classe interne statique d'une activité. Je cherche quelque chose qui fonctionnera avecminSdkVersion 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) ;
}
}
AsyncTask
ne peut pas être supprimé sans rompre la compatibilité descendante.Réponses:
Bon débarras qu'il est obsolète, car
WeakReference<Context>
c'était toujours un hack, et pas une bonne solution .Désormais, les utilisateurs auront la possibilité de désinfecter leur code.
Basé sur ce code,
Progress
n'est en fait pas nécessaire, et il y a uneString
entrée +MyPojo
sortie.C'est en fait assez facile à réaliser sans aucune utilisation d'AsyncTask.
Comment passer dans la chaîne? Ainsi:
Et
Cet exemple a utilisé un pool à un seul thread qui est bon pour les écritures DB (ou les requêtes réseau sérialisées), mais si vous voulez quelque chose pour les lectures DB ou les requêtes multiples, vous pouvez considérer la configuration Executor suivante:
la source
executor.post
. Impossible de résoudre la méthodeexecute()
place depost()
Context
dans ça? Je sais que le passage d' unContext
enAsyncTask
était l' une des questions est tout.newSingleThreadExecutor
est préférable pour les écritures, mais vous devez absolument utiliser leTHREAD_POOL_EXECUTOR
à la fin du message pour les lectures de la base de données.Google recommande d'utiliser le framework d'accès concurrentiel de Java ou Kotlin Coroutines. mais Rxjava finit par avoir beaucoup plus de flexibilité et de fonctionnalités que la concurrence java, ce qui lui a valu un peu de popularité.
la source