0

我目前正在創建一個嚴重依賴AsyncTask的電子郵件應用程序。Android AsyncTask不執行doInBackground

在應用程序中,有五個選項卡,每個選項卡中都有一個片段(收件箱,發件箱,已發送,已保存&聯繫人),其中所有片段都是從MainActivity同時加載的。除此之外,還有一個用於處理傳入郵件的後臺線程以及一個組合活動和視圖活動(兩者都使用AsyncTask來加載組件)。

由於每個選項卡/片段正在打開數據庫連接,因此加載微調器已合併。此微調器在onPreExecute中啓動,但將保持旋轉,直到調用onPostExecute。但是,在某些情況下,onPostExecute不會被調用,也不是doInBackground。

經過一番研究,我認爲doInBackground可能不會執行,因爲已經達到了線程限制/同時AsyncTask函數的數量。

因此,我該如何解決這個問題,以便始終執行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

異步任務可以並行運行,但是這取決於線程池size.Before Android 3.0的線程池大小爲1。要同時運行,您可以撥打

asynctask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,null);

更多的細節,你可以訪問https://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...)

+0

這是我現在已經在執行的所有的AsyncTask的功能和它正在運行在Android棉花糖和牛軋糖。有沒有辦法創建一個THREAD_POOL_EXECUTOR的更大的線程池,或者有沒有其他方法可以解決這個問題?新的SetupUI()。executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); –

相關問題