En2ch の2重書き込みに見える問題
が、やっと再現できた。(1週間かかった^^;)
メモリ不足だと、結果を受けるべき Activity が勝手に殺されて、
onCreate() から始まっちゃうんだね。
Activity A から startActivityForResult() を使って
結果を返してもらうように Activity B を起動した場合、
普通は、B を終了させたら、A の onActivtyResult() に結果が返ってくる。
En2ch は、そこで server から差分(B で書き込んだ分)を取ってくる
A#onActivityResult() ここで server から差分取得
↓
A#onRestart()
↓
A#onResume()
ところが、B の状態のまま、他のアプリとかを起動してメモリを大量に使うと、
A が勝手に殺されてしまう。
B の結果を待ってるはずなのに A だけが殺されてしまう。
そうなると、B を終了したときに、既に A は殺されてるので、
まず、A を作る必要があって、A の最初の onCreate() から始まるのでした。
当然のことながら、最初の onCreate() では server からデータを取得しようと
するのだが、(殺されたので B の結果を待ってることも知らない)
その直後に、B から onActivityResult() に結果が来て、
「書き込み成功したから差分取得しろ」と来るので、
A#onCreate() ここで server から取得
↓
A#onActivityResult() ここで server から書き込んだ分を取得
↓
A#onResume()
と動いてしまい、書き込んだデータを2重で server から取得してしまうのでした。
結果を待つように起動してるんだから、OS が殺すとしたら両方殺すだろ、
と思い込んでいたのが甘かったのでした。。。
というか、そうあるべきだと思うのだが、、、
Windows Mobile なら、親が殺されたら、子も殺されるぞ。
onLowMemory() でハンドリングできるようになってる訳だし、
ほんとに足らなかったら両方殺してくれよ。。。
結果を待ってるとしても、親子じゃなく、同レベルの友達って感じなんだね。。。
| 固定リンク
「Android」カテゴリの記事
- Essential Phone PH-1 のバッテリー交換(2021.12.11)
- sysbench をとってみた(2016.07.02)
- ListView の Height は WRAP_CONTENT を避けるべき(2015.12.23)
- Nexus 6 Android 6.0.1 (MMB29K) root化(2015.12.18)
- Nexus 6 Android 6.0.1 (MMB29K)(2015.12.17)
この記事へのコメントは終了しました。
コメント