getActivity()またはgetContext()がフラグメントでnullを返す問題



Problem That Getactivity



Androidアプリには特殊なケースがあります。つまり、アプリがバックグラウンドで実行されている場合、システムリソースが不足している場合、またはアプリケーションがクラッシュした場合、アプリのリソースは完全に回復され(アプリプロセスが強制終了されます)、その後アプリが回復します。バックグラウンドから削除されますフォアグラウンドに戻ると、アプリが再起動します。以下、この状況を以下と呼びます。 「メモリの再起動」 。 (画面の回転などの構成変更により、現在のアクティビティも再起動します。本質は「メモリの再起動」に似ています)

システムがアプリをリサイクルする前に、システムはアクティビティの状態を保存します。アクティビティのFragmentManagerは、アクティビティにフラグメントを保存する責任があります。 「メモリの再起動」後、アクティビティの回復はスタックの最上位から徐々に回復され、フラグメントはホストアクティビティのonCreateメソッドが呼び出された直後に復元されます(onAttachライフサイクルから)。



1.getActivity()nullポインター

'memory restart'の後、getActivity()がnullを返すか、通常はそのまま実行されるコードがnullを返し、nullポインター例外が報告されることに遭遇した可能性があります。

ほとんどの場合の理由: getActivity()を呼び出すと、現在のフラグメントはすでにonDetach()になっています。
ホストアクティビティ。例:フラグメントをポップした後も、フラグメントの非同期タスクは実行中であり、実行の完了後にgetActivity()メソッドが呼び出されるため、ポインターはnullになります。



解決:
Fragment基本クラスでActivitymActivityグローバル変数を設定し、onAttach(Activity activity)で値を割り当て、getActivity()の代わりにmActivityを使用して、onDetach(メモリリークを引き起こすリスク、ただし、このメソッドは、nullポインタフラッシュバックよりも「安全」です。

protected Activity mActivity @Override public void onAttach(Activity activity) { super.onAttach(activity) this.mActivity = activity } /** * If you use the support 23 library, the above method will prompt outdated, obsessive-compulsive partners, you can use the following method instead */ @Override public void onAttach(Context context) { super.onAttach(context) this.mActivity = (Activity)context