在我的應用程序中,我有一個活動A,它承載着Fragments
。AsyncTasks需要幾秒鐘的時間才能啓動
從(孩子)Activity B
,我在Activity A
中顯示一個具體的Fragment
,然後完成B.我們稱之爲Fragment F1
。 在F1中,我創建了AsyncTask
以從我的數據庫中讀取數據。 AsyncTask
在F1的onCreateView
方法結束時創建。
有效調用堆棧是這一個:
B onDestroy
F1 OnCreate
Task onPreExecute
A onResume
F1 OnResume
任務doInBackground
的Task.doInBackground
可能需要長達10秒被執行之前。
我的問題是:爲什麼這項任務需要很長時間才能執行?根據調用堆棧,我認爲Task在啓動之前等待Thread UI完成。或者這不是AsyncTask
的預期行爲。
這裏是我的代碼:
private class DataRetriever extends AsyncTask<Void, Void, Void>{
@Override
protected void onPreExecute(){
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
LogUtil.LOGE("Executing AnalyseScreen.DataRetriever onPreExecute");
// display a loader on screen while user is waiting
progressLoader.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
LogUtil.LOGD("Data retreiver : doInBackground start");
reloadDatas();
return null;
}
@Override
protected void onPostExecute(Void result){
// hide loader then update UI
progressLoader.setVisibility(View.GONE);
updateUI();
}
}
F1 onCreateView:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
// doing UI stuff
new DataRetriever().execute();
}
任何一種想法的?
[編輯] 在onCreateView註釋中描述的UI東西是膨脹視圖,初始化View的變量並初始化佈局中的一些ClickListener。 除此之外,F1可直接從A訪問,而不會從B獲得。
F1總結了一些數據,並且可以直接訪問。 B是數據循環的結束。此時,我希望用戶直接看到他的歷史。喜歡以身作則正在運行的應用程序
任務doInBackground執行後,才日誌「的AsyncTask #XX調用分離() 但我不知道這意味着什麼。
什麼是LogUtil的,以及它是如何看起來像?它是否比'Log.e(TAG,「顯示progressLoader」);'?有什麼優勢? – Squirrelkiller
LogUtil是一個自定義類,它在SD中執行Log.e和文件日誌以用於調試目的。看它就像一個簡單的日誌。 – Apollo
我是否理解正確:在加載屏幕的開啓和日誌中的「doInBackground start」之間最多10秒?你可以把log.e放到任何地方看看確切的代碼行。 – Squirrelkiller