2013年3月18日月曜日

FragmentActivity#onPauseの後で強制終了する件

依然としてAndroid 2.3のシェアが40%を超えている現状を踏まえて
Support Libraryを使用しているのだが、FragmentActivity#onPauseの
後にFragment#showを呼び出すと強制終了する事象が発生した。

調べてみるとViewPagerでFragmentを生成した時にFragmentActivity#onPauseが
呼ばれると強制終了する不具合があるようだ。Support Library v4を使って
発生したので、ICS以降のSDKでも発生するかどうかは不明だ。

■ Fragment + ViewPager 使用時の不具合について: Isn't It Narikitic?
http://narikitic.seesaa.net/article/268777111.html

FragmentActivity#onSaveInstanceStateでBundleがnullになっている場合が
あるらしく、内部でそこにアクセスすると強制終了するレアケースらしい。
とりあえずリンク先のおまじないを書く事で回避出来た。


【2013/4/6 追記】
FragmentActivity#onPauseの後にFragment#showを実行してダイアログを
表示した際にIllegalStateExceptionが発生するケースがあった。

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:127)

...

これも下記URLを参考にして回避出来た。具体的にはFragment#showを使用せず、FragmentTransaction#add、commitAllowingStateLossを実行する。

■ Actions in onActivityResult and "Error Can not perform this action after onSaveInstanceState"
http://stackoverflow.com/questions/12105064/actions-in-onactivityresult-and-error-can-not-perform-this-action-after-onsavei


【2013/7/30 追記】
Support Library v4 rev18において不具合が修正されたようなので、Support Libraryで
ViewPagerを使用してる人はrev18にアップデート必須。詳細は下記リンク先のIssueを参照。

■ Issue 19917 - android - ViewPager NullPointerException when onPause is called from activity and ViewPager has no adapter set. - Android Open Source Project - Issue Tracker - Google Project Hosting
http://code.google.com/p/android/issues/detail?id=19917

0 件のコメント:

コメントを投稿