2012年1月16日月曜日

Android Zygote は思ったよりも手ごわい

メール送信プログレスが出ている間にどうしても処理を中断する機能を入れようと思って色々試行錯誤してたんですよね。

最初普通にjavamailの機能から中断できるか色々探していたんですが、なぜか全然見つからない。。。

Transportオブジェクト使ってるんですけど、それがダメなんすかね?

メソッドもそれらしいのがないし、リスナーも効かない様子。

で、あまり時間もないので方針変更。
まずは処理スレッドごと落とせないか試してみました。

・処理スレッドのstopメソッドなどを呼んでみる → さすが非推奨。Logcatにエラーが出て処理は止まらない
・じゃあ、と思って強制的に例外を発生させて強引に落とす → まぁ落ちるよね。送信はキャンセルされました

でもこれじゃあ汚いのでもうちょっとスマートにできないかと思い、送信処理自体を別プロセスにして止めたらどうなるだろう?

で、アプリ内サービスでプロセスのフォークを作成するようにしてみました。

まずはサービスを止めてみる。
サービスは無事に止まったんだけど、なぜか送信処理のタスクは止まらずメールは送信されてしまいました。

なんだろう?もうjavaのプロセスを離れてネットワークカード(?)に処理が行ってしまったのだろうか?

確かめるために強制的にプロセスをkillしてみたところ、いったんは処理が止まったように見せかけてからの、まさかのサービスプロセス復活!サービスをちゃんと手順にそってストップしないとZygoteさんが復活させちゃうみたいなんですねー。

だから強引に例外を発生させたときにエラーメッセージだけでアクティビティが立ち上がってきたのか…。


この後、サービスストップとプロセスkillをやってみたりしたんですが、どうも、プロセスの強制終了自体を感知してZygoteさんがプロセスを再立ち上げしているような挙動。

ちょっとソースを読み込んで・・・というほど時間もないので、あきらめて「例外強制スロー」方式でいったんリリースすることにしました。

ソフトキーのバックキーがついている端末の人はもしかしたら使いづらくなるかも!?
送信中はディスプレイをスリープにしたりしなきゃになるかな?

風のうわさで不評などを聞いたらやめるかも知れません。

0 件のコメント:

コメントを投稿