异步任务更新UI
问题描述:
当以下异步方法更新我的主页时,我目前正在收到java.lang.IllegalStateException: Fragment HomeFragment{b862cf1} not attached to Activity
错误。异步任务更新UI
new AsyncTask<HomeCardHolder, Void, List<HomeCardModel>>() {
HomeCardHolder mHomeCardHolder;
@Override
protected List<HomeCardModel> doInBackground(HomeCardHolder... params) {
if (params != null && params.length > 0) {
mHomeCardHolder = params[0];
}
return getPunchCardDeals();
}
@Override
protected void onPostExecute(List<HomeCardModel> punchCard) {
if (isActivityAlive() && !ListUtils.isEmpty(punchCard) && mHomeCardHolder != null) {
mCardAdapter.refreshDataForCards(mHomeCardHolder.getSectionName(), punchCard);
}
}
}.execute(homeCardHolder);
事情是getPunchCardDeals()
检索交易列表,但也更新UI元素。我读过UI元素不能在后台线程上更新,那么这里的适当结构是什么?
感谢, Otterman
编辑: 如果添加片段我检查。
boolean isActivityAlive() {
return null != getActivity() && isAdded() && !getActivity().isFinishing();
}
答
在更新视图时,应确保片段与活动一起添加。为此,您应该使用fragment.isAdded()。 因此,与
if (isAdded()&&isActivityAlive() && !ListUtils.isEmpty(punchCard) && mHomeCardHolder != null)
更换
if (isActivityAlive() && !ListUtils.isEmpty(punchCard) && mHomeCardHolder != null)
可以帮助你。
只能检索doInBackground中的列表/数据等,并在postExecute中完成所有与UI相关的工作。 –
请给出一个完整的代码示例。您应该包含封装这里显示的代码行的类和方法。同时显示您创建HomeFragment的位置。 –
doInbackground应该做检索和处理,onPostExecute应该做显示。如果您有一个您定期显示的UI(例如获取100个项目,显示,然后获取下一个100项目),则可以使用publishProgress并更新进度更新中的UI。请注意,它将与doInBackground并行执行,因此不要在没有正确锁定的情况下从其下更新任何数据结构。 –