0

Je suis en train de créer une application de messagerie qui dépend fortement d'AsyncTask.Android AsyncTask n'effectue pas doInBackground

Dans l'application, il y a cinq onglets avec un fragment dans chaque (Boîte de réception, envoyés, enregistrés & les contacts) lorsque tous les fragments sont chargés en même temps de MainActivity. De plus, il y a un thread d'arrière-plan pour gérer le courrier entrant ainsi qu'une activité de composition et de visualisation (les deux utilisent également AsyncTask pour charger les composants). Lorsque chaque onglet/fragment ouvre une connexion à la base de données, un curseur de chargement a été incorporé. Ce spinner est démarré dans onPreExecute mais restera en rotation jusqu'à ce que onPostExecute soit appelé. Cependant, dans certains cas, onPostExecute n'est pas appelé et doInBackground non plus. Après quelques recherches, je pense que le doInBackground n'est probablement pas exécuté car le nombre limite de threads/nombre de fonctions AsyncTask simultanées a été atteint. Par conséquent, comment puis-je résoudre ceci pour que doInBackground soit toujours exécuté?

MainActivity - créer quelques fragments:

private void createInboxFragment() { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); Fragment mailFragment = new InboxFragment(); transaction.add(R.id.layout_main, mailFragment, "Inbox"); transaction.commit(); } private void createOutboxFragment() { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); Fragment mailFragment = new OutboxFragment(); transaction.add(R.id.layout_main, mailFragment, "Outbox"); transaction.hide(mailFragment); transaction.commit(); } private void createSentFragment() { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); Fragment mailFragment = new SentFragment(); transaction.add(R.id.layout_main, mailFragment, "Sent"); transaction.hide(mailFragment); transaction.commit(); } 

Boîte de réception Fragment - AsyncTask

private class SetupUI extends AsyncTask<Void, Void, Boolean> { @Override protected void onPreExecute() { Log.d(TAG, "onPreExecute"); progressOverlay.setVisibility(View.VISIBLE); } @Override protected Boolean doInBackground(Void... params) { Log.d(TAG, "doInBackground"); try { // Start: SetupUI setSharedObjects(); setupLists(); getUnreadCount(); setupNotification(); createSharedRunnable(); initDBFunctions(); setupListView(); setupListViewCAB(); setupListViewClick(); // End: SetupUI } catch (Exception ex) { ACRA.getErrorReporter().handleSilentException(ex); ex.printStackTrace(); handleError(); } return true; } @Override protected void onPostExecute(Boolean result) { Log.d(TAG, "0 - onPostExecute"); AndroidUtils.animateView(progressOverlay, View.GONE, 0, 250); Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { Log.d(TAG, "1 - onPostExecute"); finaliseListView(); } }; handler.postDelayed(runnable, 750); } } 

Répondre

1

tâche Async peut fonctionner en parallèle mais cela dépend de pool de threads size.Before android 3.0 taille du pool de fil était 1. Pour exécuter simultanément, vous pouvez appeler

asynctask.executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR, null);

pour plus de détails vous pouvez visiter https://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...)

+0

Voilà comment je suis déjà exécuter toutes les fonctions AsyncTask et il est d'être exécuté sur Android Marshmallow et Nougat. Existe-t-il un moyen de créer un pool de threads plus important que le THREAD_POOL_EXECUTOR ou existe-t-il d'autres moyens de contourner ce problème? nouveau SetupUI(). executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR); –