在我的应用中,我有一个托管Fragments
的活动A.
从(孩子)Activity B
,我在Fragment
中显示特定Activity A
,然后结束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仅在log&#34; AsyncTask #XX调用detach()之后执行 但我不知道这意味着什么。
答案 0 :(得分:0)
DataReceiver
确实只是在你的“做UI事情”完成时开始,如果你的onPostExecute()想要访问那些UI东西,这可能是最好的。
你当然可以将“UI内容”放在DataReceiver
s onPreExecute中,减去需要在onCreateView中的内容(这里不确定,只是不想破坏任何内容,我猜是{{需要返回的1}}。
您还可以启动AsyncTask,它只会下载和/或计算inflater.inflate(stuff)
中的内容,并在onCreate
(例如onPostExecute
)中设置某种回调或类似内容。< / p>
答案 1 :(得分:0)
我找到了它!
我的应用程序中有很多AsyncTasks
,而来自Activity B
的这个似乎正在排队并等待其他人完成。
有两种解决方案:
取消其他任务
在并行执行程序中执行此任务:
new DataRetreiver().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void)null);