2017-02-24 113 views
0

當以下異步方法更新我的主頁時,我目前正在收到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並行執行,因此不要在沒有正確鎖定的情況下從其下更新任何數據結構。 –

回答

0

在更新視圖時,應確保片段與活動一起添加。爲此,您應該使用fragment.isAdded()。 因此,與

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

更換

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

可以幫助你。