onSaveInstanceState() メソッドと setArguments() メソッドによって引き起こされるシリアル化の問題

シナリオの説明

Umeng を使用して写真を共有すると、アプリケーション インターフェイスは DialogFragment を継承します。その後、共有チャネル内の他のアプリにジャンプした後、アプリがクラッシュして再起動します。ログを観察すると、報告されたエラーは Parcelable で IOException 書き込みが発生したことがわかります。シリアル化可能なオブジェクト。

衝突解析

エラー メッセージによると、シリアル化エラーであることがわかったので、値が転送される場所を確認したところ、エラーが発生したクラスで、serializable が実装されており、内部のカスタム クラス オブジェクトがシリアライズ可能も実装されています。
しかし、なぜこのエラーが依然として発生するのでしょうか?
現象を観察したところ、他のアプリケーションにジャンプした直後にクラッシュが発生していることがわかりました。このアプリケーションでインターフェイスを開くのは問題ありません。リサイクルが原因でしょうか?

位置決めの問題

問題のあるインターフェイスに onSaveInstanceState() メソッドを実装し、このメソッドが親クラスでどのように動作するかを観察します。すると、この方法は主に、予期せぬ状況でインターフェースが消失したときに一時データを保存するために使用され、主にその後のインターフェースの回復に使用されることがわかりました。参考記事:onSaveInstanceStante() メソッドはいつ呼び出されますか? (再印刷/整理)
では、データを対応するバンドルに保存するにはどうすればよいでしょうか? 明らかに、データの保存処理は行っていませんが、このメソッドはどのバンドルを保存したいのかをどのように認識するのでしょうか。
次に、値を渡すメソッド setArguments() を確認しました。この方法は、まさに上記の状況でデータを保存するために使用されます。参考記事:パラメータを渡すために Fragment.setArguments (Bundle バンドル) を使用する理由
注: 予期しない状況には、ユーザーがホーム ボタンを押したり、水平画面と垂直画面を切り替えたり、アプリケーションの切り替えジャンプが含まれます。

結論は

Serializable シリアル化を使用してフラグメントに値を保存すると、リサイクル時に使用されるシリアル化メソッドが Parcelable であるため、シリアル化例外が発生します。したがって、シリアル化クラスに Parcelable を実装すると、問題を解決できます。
ps: 上記 2 つの方法を注意深く観察して研究したわけではないため、結論はいくぶん推測的なものになります。間違いや漏れがございましたら、ご指摘いただければ後ほど勉強して修正・修正させていただきます。

おすすめ

転載: blog.csdn.net/qq_39734865/article/details/104522703