在我的应用程序中,我有一个活动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