0

私は、タブとフラグメントを使用するアプリを持っています。私のタブの1つに、ヘッダービューとフッタービューを含むListViewがあります。Android - ListViewが空のときにAsyncTaskエラーが発生しましたか?

リスト内の項目は、AsyncTaskを使用して取得したXMLフィードを介してデータベースから収集されます。リスト内の項目は、すべてが正確に機能するはずです。しかし、アイテムがなく、リストビューが空の場合、タブを切り替えようとすると以下のエラーが表示されることに気付きました。

java.lang.IllegalStateException: Fragment Pending{3223f5a4} not attached to Activity 

まだ私のデータが空に戻ってきた場合、私は、少なくとも私のリストのヘッダー/フッターが表示されるように、私はmyList.setAdapter(null)を呼ぶのですが、私は可能性としてそれを排除するために、それをコメントアウトしてみました私の爆弾。

これはどうなりますか?私のasynctaskで返されたデータを持っていれば、すべてが正常に動作します。

私は必要に応じてコードを追加できますが、誰かがこれを引き起こす原因を知っているかどうかを知りたいと思っていました。

AsyncTask問題

private class GetMaintenanceRequestsPending extends AsyncTask<String, Integer, Integer> 
    { 
     @Override 
     protected void onPreExecute() { 
      progressDialog = ProgressDialog.show(getActivity(), "", getResources().getString(R.string.general_msg_please_wait)); 
     } 

     @Override 
     protected Integer doInBackground(String... params) { 
      //First check if network is connected, if not take user to network error activity. 
      if(!NetworkStatus.getInstance(getActivity().getApplicationContext()).isOnline(getActivity().getApplicationContext())) { 
       return AppConstants.STATUS_NETWORK; 
      } 
      try {  
       getMaintenancePending(params[0],params[1]); 
       if (maintenancePendingData == null) { 
        return AppConstants.STATUS_ERROR; 
       } else { 
        return AppConstants.STATUS_SUCCESS; 
       } 
      } catch (Exception e) { 
       return AppConstants.STATUS_ERROR; 
      } 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } 

     @Override 
     protected void onPostExecute(Integer result) { 
      // NETWORK ERROR HAS OCCURRED - SHOW NETWORK ACTIVITY 
      if (result == AppConstants.STATUS_NETWORK) { 
       new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         progressDialog.dismiss(); 
         Intent networkError = new Intent(getActivity(), NetworkError.class); 
         networkError.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         startActivity(networkError); 
         getActivity().finish(); 
        } 
       }, 1000); 
      } 
      // ERROR OCCURRED 
      else if (result == AppConstants.STATUS_ERROR) { 
       progressDialog.dismiss(); 
       alertDialog.showAlertDialog(getActivity(), getString(R.string.error), getString(R.string.error_connect), false, false); 
      } 
      else { 
       // SUCCESS! 
       layoutMaintenanceSwipeRefresh.setRefreshing(false); 
       Globals.refreshMaintenanceRequestData = false; 
       setupPendingRequests(); 
      } 
     } 
    }  

私のAsyncTaskで何かがとにかくトリガーされる理由を私は理解していないです原因?タブが読み込まれたときに呼び出され、タブから移動しているので、なぜ再び呼び出されますか?

また、AsyncTask onPostExecuteメソッドのsetupPendingRequests()メソッドが呼び出されます。タブを切り替えようとするまでは、まったく同じように動作するように見えます。次に、エラーをスローします。私はそれがときどきエラーとしてWindowLeakedと言い、それ以外の時間はアクティビティに付随していないことに気付きました。

UPDATE 8.24.16

だから私は私のコードを経て、このエラーを引き起こす私はそのことを考える可能性が何かを削除しようとしました。ここに私が見つけたものがあります。私の断片では、以下のコードを使用して、アニメーションが完了した後、UI作業(AsyncTaskとUI要素値の設定)をトリガーします。私のリストビューが空であったとき、何らかの理由でこのメソッドが私の問題を引き起こしています。この方法がどのように動作するかの私の理解から、

//@Override 
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { 
     Animation animation = super.onCreateAnimation(transit, enter, nextAnim); 
     final Boolean fragmentShown = enter; 
     if (animation == null && nextAnim != 0) { 
      animation = AnimationUtils.loadAnimation(getActivity(), nextAnim); 
     } 
     if (animation != null) { 
      if (getView() != null) { 
       getView().setLayerType(View.LAYER_TYPE_HARDWARE, null); 
       animation.setAnimationListener(new Animation.AnimationListener() { 
        @Override 
        public void onAnimationStart(Animation animation) { 
        } 

        @Override 
        public void onAnimationRepeat(Animation animation) { 
        } 

        public void onAnimationEnd(Animation animation) { 
         getView().setLayerType(View.LAYER_TYPE_NONE, null); 
         if (fragmentShown) { 
          new Handler().postDelayed(new Runnable() { 
           @Override 
           public void run() { 
            setupFragment(); 
           } 
          }, 200); 
         } 
        } 
       }); 
      } 
     } else { 
      setupFragment(); 

、私は私が私の仕事をし、その後、完全であることをフラグメントのアニメーションをお待ちしております{...私の宇井もの}(fragmentShown)場合を呼び出します。また、アニメーションがnullであるかどうかをチェックしています。このフラグメントに対してアニメーションが設定されておらず、UIのものが呼び出されています。

リストビューのデータセットが空のときにこのメソッドが問題を引き起こすのはなぜですか? 私は分かりません。私はこのメソッドを削除して代わりに、私のsetupFragment()のフラグメントをonResume()メソッドで呼び出すことで修正しました。しかし、私はこれがなぜ起こったのかを理解したいと思うし、アニメーションメソッドをそこに保持するために何らかの方法で修正できるかどうかを知りたい。 } リターンアニメーション; }

+0

空のリストを含むビュー、または空のリストを含むビューからタブに切り替えるのですか? –

+0

コードを –

+0

@ M.Palsichと共有してください。空のリストを含むビューから離れてください。私が切り替えているタブは非常にシンプルで、連絡先情報を表示して表示するasynctaskです。私はいずれかのタブに切り替えるとエラーが発生します。 – Phil

答えて

1

あなたのアプリではバックグラウンドタスクを実行しているので、タスクが終了するまでユーザーが同じ画面にとどまるという保証はありません。そのため、ユーザーはタスクが完了する前に他の画面に移動したりホームボタンを押したりします。あなたのフラグメントはアクティビティから切り離されます。だから、常にアクティビティにフラグメントが添付されていることを確認してください。詳細について

if (isAdded) { 
//Do your UI stuff here 
} 

でチェックしてみてください、このリンクを参照してください:私はあなたがあなたの全体のコードが表示されないので、それはあなたのために働くことを確認していないが、それは仕事

Fragment MyFragment not attached to Activity

+0

あなたの提案をありがとうございます、私はそれを与えるでしょう。しかし、リストビューのデータが空の場合にのみ、このエラーが発生するのはなぜですか? – Phil

+0

- 時間がある場合、質問を更新しました。私は問題を引き起こしていたものを見つけましたが、なぜそれが起こったのか分かりません。 – Phil

0

を私にとっては、このメソッドをRecylerビューフラグメントに追加するだけです。

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 

    if (isVisibleToUser && mDataset.isEmpty()) { 

     Log.i(TAG, "start Asyc task "); 

     new LoadRssFeedsItems(getActivity()).execute(Constants.DW_HOME_PAGE_URL); 


    } 

}

+0

質問が更新された場合は、私は問題を引き起こしていたものを見つけましたが、なぜそれが起こったのか分かりません。 – Phil

関連する問題