2015-05-20 149 views
3

在我的應用程序中,我有一個活動A,它承載着FragmentsAsyncTasks需要幾秒鐘的時間才能啓動

從(孩子)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調用分離() 但我不知道這意味着什麼。

+0

什麼是LogUtil的,以及它是如何看起來像?它是否比'Log.e(TAG,「顯示progressLoader」);'?有什麼優勢? – Squirrelkiller

+0

LogUtil是一個自定義類,它在SD中執行Log.e和文件日誌以用於調試目的。看它就像一個簡單的日誌。 – Apollo

+0

我是否理解正確:在加載屏幕的開啓和日誌中的「doInBackground start」之間最多10秒?你可以把log.e放到任何地方看看確切的代碼行。 – Squirrelkiller

回答

0

我找到了!

我在我的應用程序中有很多AsyncTasks,看起來這個來自Activity B的隊列正在排隊等待其他人完成。

解決辦法有兩個:

  • 取消其他任務

  • 在並行執行,執行此任務:

    new DataRetreiver().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void)null); 
    
0

DataReceiver確實只有開始時你的」做UI的東西「,這可能是最好的,如果你的onPostExecute()想要訪問該UI的東西。

你當然可以把」UI東西「放在DataReceiver的onExExcute中,減去需要的東西在onCreateView(不知道這裏,只是不想摧毀任何東西,我猜想inflater.inflate(stuff)需要返回)

您也可以啓動一個AsyncTask,它只會下載和/或計算onCreate中的內容,並在onPostExecute(例如someHandler.post(updateUIRunnable))中設置某種回調或某種內容。

相關問題