Dans le développement Android, à propos du traitement série et du traitement parallèle avec AsyncTask, je ne savais pas quel genre de mouvement il s'agirait s'il fonctionnait presque en même temps, et la commande est réellement garantie, alors composons légèrement le code et vérifions-le. Je l'ai fait, alors j'aimerais le garder comme note de service.
[URL de référence] developer - AsyncTask Traitement Android-Serial d'AsyncTask? Traitement parallèle? Comment est réalisé le traitement asynchrone d'AsyncTask
task1:execute() task2:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
//Première tâche asynchrone
AsyncTask task1 = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
Log.v("task1", "start!!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Log.v("task1", "done!!!");
}
}
.execute();
//Deuxième tâche asynchrone
AsyncTask task2 = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
Log.v("task2", "start!!!");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Log.v("task2", "done!!!");
}
}
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Je l'ai couru plusieurs fois pour voir s'il était en ordre.
【Première fois】
5970-5995/com.example.testcode V/task2: start!!!
5970-5994/com.example.testcode V/task1: start!!!
5970-5970/com.example.testcode V/task2: done!!!
5970-5970/com.example.testcode V/task1: done!!!
【Deuxième fois】
7138-7157/com.example.testcode V/task2: start!!!
7138-7156/com.example.testcode V/task1: start!!!
7138-7138/com.example.testcode V/task2: done!!!
7138-7138/com.example.testcode V/task1: done!!!
【Troisième fois】
7383-7403/com.example.testcode V/task1: start!!!
7383-7404/com.example.testcode V/task2: start!!!
7383-7383/com.example.testcode V/task2: done!!!
7383-7383/com.example.testcode V/task1: done!!!
Le deuxième départ est inversé. .. ..
task1:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) task2:execute()
//Première tâche asynchrone
AsyncTask task1 = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
Log.v("task1", "start!!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Log.v("task1", "done!!!");
}
}
.execute();
//Deuxième tâche asynchrone
AsyncTask task2 = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
Log.v("task2", "start!!!");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Log.v("task2", "done!!!");
}
}
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Je l'ai également essayé plusieurs fois pour voir s'il était en ordre.
【Première fois】
7267-7273/com.example.testcode V/task2: start!!!
7267-7272/com.example.testcode V/task1: start!!!
7267-7267/com.example.testcode V/task2: done!!!
7267-7267/com.example.testcode V/task1: done!!!
【Deuxième fois】
7643-7662/com.example.testcode V/task1: start!!!
7643-7663/com.example.testcode V/task2: start!!!
7643-7643/com.example.testcode V/task2: done!!!
7643-7643/com.example.testcode V/task1: done!!!
【Troisième fois】
7871-7891/com.example.testcode V/task1: start!!!
7871-7892/com.example.testcode V/task2: start!!!
7871-7871/com.example.testcode V/task2: done!!!
7871-7871/com.example.testcode V/task1: done!!!
Le résultat de l'exécution ici est similaire à celui du Prototype 1.
Il semble que l'ordre de traitement n'est pas garanti lorsque le traitement série et le traitement parallèle sont exécutés presque en même temps. Si vous voulez sûrement garantir la commande, il est préférable de faire les deux en série.
C'est différent! Je pense qu'il y a un point, mais j'espère que ce sera utile.
c'est tout.
Recommended Posts