0

私は現在、AsyncTaskに大きく依存している電子メールアプリケーションを作成しています。Android AsyncTaskが実行されていないdoInBackground

アプリ内には、MainActivityからすべてのフラグメントが同時に読み込まれる(受信トレイ、送信トレイ、送信済み、保存済み&連絡先)のフラグメントが5つあります。これに加えて、受信メールを処理するためのバックグラウンドスレッドと、作成アクティビティとビューアクティビティ(どちらもAsyncTaskを使用してコンポーネントをロードします)があります。

各タブ/フラグメントがデータベース接続を開いているので、ローディングスピナーが組み込まれています。このスピンナーはonPreExecuteで開始されますが、onPostExecuteが呼び出されるまで回転し続けます。ただし、場合によっては、onPostExecuteは呼び出されず、どちらもdoInBackgroundは呼び出されません。

いくつかの調査を行った後、スレッド制限/同時のAsyncTask関数の数に達したため、doInBackgroundが実行されない可能性があります。

したがって、どうすればdoInBackgroundが常に実行されるように解決できますか?いくつかの断片を作成する -

MainActivity:

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(); } 

受信トレイ断片 - 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); } } 

答えて

1

非同期タスクを並列に実行することができますが、それは1だったスレッドプールsize.Beforeアンドロイド3.0スレッドプールのサイズによって異なります。同時に実行するには、

asynctask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR、null);を呼び出します。詳細について

ます。これは、私はすでに、すべてのAsyncTaskの機能を実行することだし、それは、Androidマシュマロ&ヌガーに走ったされています方法ですhttps://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...)

+0

を訪問することができます。 THREAD_POOL_EXECUTORというより大きなスレッドプールを作成する方法はありますか、それとも他の方法がありますか?新しいSetupUI()。executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); –

関連する問題