Translate

BTemplates.com

Powered by Blogger.

2017年9月6日水曜日

2017-09-05 到達点メモ


スリープは設定で自動では起きないとはいえ
VoiceTimerでちょっとまずいバグを見つけた。
具体的にはスリープ時にタイムアップすると
0000でないのにタイムアップするときがあるという現象です。
殆ど使っている人はいませんが、ご迷惑をおかけして申し訳ありません。

具体的には内部処理でCountDownTimerを採用してましたという話。
これディープスリープ時だと値がずれるらしいです。
正確には、タイマーの表記上は00:00になっていないのに
アラームが鳴っていたりしました。
一応認識はしていたのですが、きちんと現象としては再現できていなかったので
無視していた形でした。
どうもケーブルに接続しているとディープスリープにならないようでした。
内部の値的に0になっていないのか、単に画面更新がされていないのかちょっと区別ができなかったので……
自分もすっかり忘れていたのですが、Log.dの中身はケーブルを接続している最中に動作させなくてもLog.dを吐き出した直後にケーブルをつなげば、AndroidStudioのログでも見れるときもあります。
結果は、ログを見た限りでは内部の値も0になっていませんでした。

参考サイト
CountDownTimerを使ってはいけない2つの理由「Android」(1)
CountDownTimerを使ってはいけない2つの理由「Android」(2)

それで、AlarmMangerを使うところまではわかったのですが、
途中経過も知りたいのでこれだと機能が足りない。

参考サイト
[Android] タイマーアプリをAlarmManagerを使って作る

最初は、onActivityResultを使う事を考えていたのだが、
そもそも、receiveでは、contextは単にstartActivity()しか使えないため
requestcodeを送ることができないのでどう見ても無理。
で、色々調べまわったところ、まさしくやりたいことを見つけまして
How to update UI in a BroadcastReceiver
そうだよ。アクティビティに戻したいとかじゃなくて
UIを更新したいんじゃん。

 public void updateUI(final String str) {
        MainActivity.this.runOnUiThread(new Runnable() {
            public void run() {
     //use findFragmentById for fragments defined in XML ((SimpleFragment)getSupportFragmentManager().findFragmentByTag(fragmentTag)).updateUI(str);
            }
        });
    }
上あたりの内容が手っ取り早そうだったので早速試してみたが
うまくいかなかったので下のを試す
WakeLockじゃなくてAlarmManagerを使って定期的な処理を継続する

こっちをさっさと試せばよかった。
ひとまず、onReceiveをしたら
Viewの更新ができるようになった。
幾つか嵌ったところを書けば、intervalは単に値を指定しているだけなので
別にintentとかの処理は書かなくても良い
インターフェイスはメインのアクティビティにインタフェースの実装(implements)をしなくてはいけないというぐらいだろうか。
うーん。我ながら全然読んでいない感と勉強していない感……

参考サイト
とほほのJava入門-インタフェース
TECHBOOSTER-独自リスナーを作成する

色々考えこむよりは試した方が速そうだなぁ
一先ず動くものができないと話ならない。
まずは、AlarmManagerを試して問題があれば
Handlerだろうか

参考サイト
Android開発ログ-Androidの管理する時間について
Y.A.M の 雑記帳-AlarmManager

少ししか検証できていないが
どうもうまくいかん。というか初回はともかくして二回目以降は
明らかに1秒以上でたっても更新されない。
更新作業自体がないわけではないのだが、これではちょっと使い物にならない。
あと、スライドさせてアプリを終了させると異常終了が出るのが
ちょっとなぁ……。

そういえば、この件前に疑問に思って調べたけど分からなかった部分だから
割と真面目に一度質問したほうがいいかもなぁ……。


0 コメント:

コメントを投稿