掲題について質問させて下さい。
Handlerのディレイ処理、
例えばsendEmptyMessageDelayedやpostDelayedを呼び出すと、ディレイ処理が掛かってない処理が先に呼び出されてしまうように見えます。
Handlerに独自LooperとCallbackを登録し、お手軽にキューイングが出来るものと勝手に思っていたのですが、実際は上記のようにディレイ処理に限り追い越しがかかるため、対応に苦慮しております。
そこで質問なのですが、
1. ディレイ処理を含む処理でもキューイングが働くようにhandlerにオプションを設定することは可能でしょうか。
2. オプションのような形で設定できない場合、コールバックの中でSystemClock.sleepでディレイしようと思うのですが、設計上懸念点はございますか。
3. 上記方式が取れない場合、お手軽に猿でも分かるようなキューイングの実装方法をご教授願えませんか。
以上、よろしくお願い致します。
最初なるほど!と思い、
自分なりに理解を進めたのですが、
最終的に自分の技量だとこの処理はバグが発生しても分からなそうで嫌だなぁと思い、実際レビュアーにも説明できなかったので
結局当初のコールバック内でsleepするという
手段を取ってしまいました。
貴重なご意見をいただいたのに、申し訳ありません……
嫌だなぁと思ったのは、
発火するキューをいつ積むかというタイミングです。
ご回答には暗黙の了解として書いてあったと思うのですが、sendMessageDelayedなどでメッセージを遅送する直前だという認識でおります。
送り出し側(最低7つあります)とコールバック先は違うスレッドにいますが、銘々が同じキューを参照、取得する場合共有地?的な問題が発生しそうとパッと見、思いました。
調べを進めた結果、プロデューサ・コンシューマーデザインパターン用のBlockingQueueを使えば良さそうと一定の解は得ました。
しかし、並行スレッドによるプログラミングは経験がなく、周囲に有識者もいない環境のため、使いたいけど自分でも何でこれならいいのかレビュアーに十分説明出来ず、
自分でもスレッドスリープでいいではないか、removecallback動くし、Looper止められるのはアプリが終了するときだけだし、業務利用を考えたらメモリリークはぶっちゃけ心配ないしとの心の声に押されて、当初案に何となく流された次第です。
申し訳ありません。。。
コールバックにスリープ処理を入れた場合、メインスレッドではなく、Handlerに登録した独自Looperがスリープに入ると思っていたのですが間違っていたのでしょうか…
仰るようにメインスレッドでスリープした場合はANRが発生するし、明らかに画面がもっさりするので注意していたつもりでした。
画面のメインスレッドではなく、独自Looperがスリープすることの危険性がいかほどなのか、知りたい次第です。
お忙しい中、誠に申し訳ありません。
恐れいりますが、よろしくお願いします。
既存処理において、別スレッドで起動した独自Looperにメッセージを投げる処理を元々しており、呼び出し順番などは意識した設計となっておりませんでした。
その改修作業において、1. 呼び出し順番を守ること 2. ディレイ処理が一部において実施することの二点が新規要件で追加になったため、既存ロジックをなるべく壊さずに要件を満たす設計を考慮した上でHandlerによる順列処理に固執した次第です。質問の背景を十分に説明せず、申し訳ありません。
長々とお時間をお借りして、申し訳ありませんでした。ご質問にのっていただき、大変ありがとうございます。
スリープ中のルーパーにメッセージが乗った時、消えることは本当にないかなど不安という名の疑問はまだまだ尽きないのですが、一旦頭を冷やします。
ありがとうございました。
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。
noxiさん
単純なリストで、時間順にソートされてるということですね。
すっきりしました。
ありがとうございます。