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