异步任务更新UI

异步任务更新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(); 

} 
+2

只能检索doInBackground中的列表/数据等,并在postExecute中完成所有与UI相关的工作。 –

+0

请给出一个完整的代码示例。您应该包含封装这里显示的代码行的类和方法。同时显示您创建HomeFragment的位置。 –

+1

doInbackground应该做检索和处理,onPostExecute应该做显示。如果您有一个您定期显示的UI(例如获取100个项目,显示,然后获取下一个100项目),则可以使用publishProgress并更新进度更新中的UI。请注意,它将与doInBackground并行执行,因此不要在没有正确锁定的情况下从其下更新任何数据结构。 –

在更新视图时,应确保片段与活动一起添加。为此,您应该使用fragment.isAdded()。 因此,与

if (isAdded()&&isActivityAlive() && !ListUtils.isEmpty(punchCard) && mHomeCardHolder != null) 

更换

if (isActivityAlive() && !ListUtils.isEmpty(punchCard) && mHomeCardHolder != null) 

可以帮助你。