我目前正在创建一个严重依赖AsyncTask的电子邮件应用程序。
在应用程序中,有五个选项卡,每个选项卡中包含一个片段(收件箱,发件箱,已发送,已保存和联系人),其中所有片段同时从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); } }
答案 0 :(得分:2)
异步任务可以并行运行,但它取决于线程池大小。在android 3.0线程池大小为1.对于同时运行,你可以调用
asynctask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,null);
有关详细信息,请访问https://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...)