【Android】安全にonActivityResultを実行する


アクティビティから他のアクティビティを呼び出して、その結果を貰い何かを実行する場合がある。定石としては onActivityResultメソッドをオーバーライドして、その中で処理を実行するというものだが、この方法だと稀にわけの分からん例外が発生する。

この例外を発生させずに安全にコードを実行するサンプルを書いてみてる。

例外の原因

いろいろ調べてみた結果、次のような記事を発見した。

“Failure Delivering Result ” - onActivityForResult

この回答によると、

At the time that onActivityResult() is called, the activity/fragment's state may not yet have been restored, and therefore any transactions that happen during this time will be lost as a result.

らしい。要するにonActivityResultが呼ばれたときにアクティビティ/フラグメントが完全にリストアされているかどうか保証されていないということ。

解決策としては復帰後に呼ばれる onPostResumeメソッドでやりたい処理を実行すればよいとのこと。これは順序的には onActivityResult => onPostResume => onResume にとなっており、 onPostResumeメソッドは、アクティビティ/フラグメントがリストア済で呼び出されるようだ。

解決コード

というわけでStackoverflowの回答を発展させて、次のようなコードを書いた。

大して難しいことはしていなくて、単に onActivityResultメソッドで結果を保持しておいて、 onPostResumeメソッドが呼び出されたときに onPostResumeWithActivityResultメソッドを呼び出してあげる。

各アクティビティクラスは次のような感じになる。

各アクティビティの onPostResumeWithActivityResultメソッドには、従来 onAcitivityResultメソッドに書いていた処理を書くことになるわけだ。

とりあえずこれで上手くいっている。なんか問題あったら教えてください。

関連する記事


コメントを残す

メールアドレスが公開されることはありません。


*