[解決済み] java.lang.IllegalStateException: フラグメントがアクティビティにアタッチされていない
2022-04-23 17:33:40
質問
APIコール時に稀にこのエラーが発生することがあります。
java.lang.IllegalStateException: Fragment not attached to Activity
の中にコードを入れてみました。
isAdded()
メソッドを使用して、フラグメントが現在そのアクティビティに追加されているかどうかをチェックしますが、それでもこのエラーはほとんど発生しません。なぜこのエラーが発生するのか理解できません。どうすればこのエラーを防ぐことができるのでしょうか?
行にエラーが表示される...
cameraInfo.setId(getResources().getString(R.string.camera_id));
以下は、私が作っているapiコールのサンプルです。
SAPI.getInfo(getActivity(),
new APIResponseListener() {
@Override
public void onResponse(Object response) {
cameraInfo = new SInfo();
if(isAdded()) {
cameraInfo.setId(getResources().getString(R.string.camera_id));
cameraInfo.setName(getResources().getString(R.string.camera_name));
cameraInfo.setColor(getResources().getString(R.string.camera_color));
cameraInfo.setEnabled(true);
}
}
@Override
public void onError(VolleyError error) {
mProgressDialog.setVisibility(View.GONE);
if (error instanceof NoConnectionError) {
String errormsg = getResources().getString(R.string.no_internet_error_msg);
Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show();
}
}
});
解決方法は?
このエラーは、2つの要因が複合的に作用することで発生します。
-
HTTP リクエストが完了したとき、次のいずれかを呼び出します。
onResponse()
またはonError()
(メインスレッドで動作する)のかどうかがわからずにActivity
がまだフォアグラウンドにあるかどうか。もしActivity
が消えている(ユーザーが別の場所に移動した)。getActivity()
は null を返します。 -
ザ・ボレー
Response
は無名の内部クラスとして表現され、このクラスは暗黙のうちに外部のActivity
クラスがあります。この結果、典型的なメモリーリークが発生します。
この問題を解決するために、必ず行うべきことは
Activity activity = getActivity();
if(activity != null){
// etc ...
}
を使用し、さらに
isAdded()
の中に
onError()
メソッドも同様です。
@Override
public void onError(VolleyError error) {
Activity activity = getActivity();
if(activity != null && isAdded())
mProgressDialog.setVisibility(View.GONE);
if (error instanceof NoConnectionError) {
String errormsg = getResources().getString(R.string.no_internet_error_msg);
Toast.makeText(activity, errormsg, Toast.LENGTH_LONG).show();
}
}
}
関連
-
[解決済み】フラグメントMyFragmentがアクティビティにアタッチされない。
-
repo: コマンドが見つかりません
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] インスタンス状態の保存を使用してアクティビティ状態を保存するにはどうすればよいですか?
-
[解決済み] Androidのローテーションでアクティビティを再開する
-
[解決済み] FragmentでonActivityResultが呼び出されない
-
[解決済み] Intentsを使用して、あるAndroid Activityから別のAndroid Activityにオブジェクトを送信するにはどうすればよいですか?
-
[解決済み] 新しいAndroid Fragmentをインスタンス化するためのベストプラクティス
-
[解決済み] ボタンクリックで新しいアクティビティを開始する方法
-
[解決済み】Androidで透明なActivityを作成する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NetworkOnMainThreadException
-
ActivityはOnFragmentInteractionListenerを実装しなければならないに関する質問
-
アンドロイドスタジオのエラーを解決する --> Error:(1, 0) id 'com.android.application' を持つプラグインが見つかりません。
-
指定された子にはすでに親がいます。まず、その子の親に対して removeView() をコールする必要があります。
-
エラー:未宣言の識別子(AS)の使用
-
JVMのエラーに遭遇しました。Java Runtime Environmentによって致命的なエラーが検出されました。
-
Android--shape--描画のコーナー、グラデーション、パディング、サイズ、ソリッド、ストロークのプロパティを指定する。
-
Android Studio常见错误之:Rendering Problems/The following classes could not be instantiated
-
Android.support.v7.widget.Toolbar が見つかりませんでした。
-
android.content.ActivityNotFoundException を解決します。Intent問題を処理するActivityが見つからない