getActivity()空ポインタ解決方法
2871 ワード
開発プロジェクトでgetActivity関数が空の場合、apk空ポインタがクラッシュする問題があり、コードロジックに明らかな原因がないことを確認します.
Activity.を見たらJava、FragmentActivity.JAvaのソースコードは原因を見つけることができます.Activityインスタンスがバックグラウンドにある場合、システムはリソースを回収する際にActivityを回収し、onSaveInstanceState関数にfragmentの状態を保存し、再びこのActivityを開くと、onCreateメソッドでbundleのfragmentの状態を取り出す可能性が高いが、fragmentに対応するActivityはとっくに存在しないため、getActivityは空である.
FragmentActivity.java:
ソースコードからソリューションがわかります:1、onSaveInstanceState関数を上書きし、bundleに保存しません.2、onCreateメソッドを上書きし、FRAGMENTSを削除するTAGパラメータ.(注:ActivityとFragmentActivityのFRAGMENTS_TAGの定義が異なる)
例:
Activity.を見たらJava、FragmentActivity.JAvaのソースコードは原因を見つけることができます.Activityインスタンスがバックグラウンドにある場合、システムはリソースを回収する際にActivityを回収し、onSaveInstanceState関数にfragmentの状態を保存し、再びこのActivityを開くと、onCreateメソッドでbundleのfragmentの状態を取り出す可能性が高いが、fragmentに対応するActivityはとっくに存在しないため、getActivityは空である.
FragmentActivity.java:
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
}
mFragments.dispatchCreate();
}
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Parcelable p = mFragments.saveAllState();
if (p != null) {
outState.putParcelable(FRAGMENTS_TAG, p);
}
}
ソースコードからソリューションがわかります:1、onSaveInstanceState関数を上書きし、bundleに保存しません.2、onCreateメソッドを上書きし、FRAGMENTSを削除するTAGパラメータ.(注:ActivityとFragmentActivityのFRAGMENTS_TAGの定義が異なる)
例:
public class TestActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
savedInstanceState.remove(“android:support:fragments”); // : Activity android:fragments, super.onCreate !!!
}
super.onCreate(savedInstanceState);
}
//
protected void onSaveInstanceState(Bundle outState) {
//super.onSaveInstanceState(outState); // ,
}