2017-02-24 29 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のリスト/データなどを取得し、すべてのUI関連の作業をpostExecuteで行います。 –

+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) 

を交換します。

関連する問題