私は、タブとフラグメントを使用するアプリを持っています。私のタブの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()メソッドで呼び出すことで修正しました。しかし、私はこれがなぜ起こったのかを理解したいと思うし、アニメーションメソッドをそこに保持するために何らかの方法で修正できるかどうかを知りたい。 } リターンアニメーション; }
空のリストを含むビュー、または空のリストを含むビューからタブに切り替えるのですか? –
コードを –
@ M.Palsichと共有してください。空のリストを含むビューから離れてください。私が切り替えているタブは非常にシンプルで、連絡先情報を表示して表示するasynctaskです。私はいずれかのタブに切り替えるとエラーが発生します。 – Phil