Translate

BTemplates.com

Powered by Blogger.

2017年9月7日木曜日

2017-09-06 到達点メモ


もしかするとアラームとキッチンタイマーの意味を勘違いしていたかもしれない。
アラームは、指定した時間に起きることが重要であって
それまでの時間はあまりリアルタイムに出すことは重要ではない
一方で、キッチンタイマーは終わりの時間ももちろん重要だが
それまでの時間も重要視している。

調べてみると、どうも時計とかの処理をやりたい場合は
Handlerの方がやりやすいというのが記述があった
どちらかと言えば、自分がやりたいことはアラームよりは時計にのほうが近いだろう
そもそもにしてどうも単体で呼び出した場合は、最速で5秒らしくまた繰り返し読んだ場合は最速で1分かかるらしい。
道理で、遅いわけだ……

参考サイト
techium-AlarmManagerを攻略する

一応、でけた。
handlerでやるのが楽だしスマートだ。

参考サイト
AndroidでTimerを使わずHandlerだけでお手軽に定期実行してあげる


公式ドキュメントの推奨方法だから
問題はないとは思うが一応調べたほうがいいかな……。
あと、いつの間にかConstraintLayoutというやつがあったんだな。
最近とかの話じゃなくて一年以上前には実装されていたみたい。

参考サイト
Androidの新しいLayout、ConstraintLayoutことはじめ
[Android] 新しいレイアウト登場!Constraint Layoutについて


調べてみたらHandlerは重い処理の時に落ちることがあるらしい。
今回に限ってはないとは思うのですが、念のためHandlerThreadの方で書くことにする。

参考サイト
Android 非同期処理についてまとめる メモ

あと、今回は、カウントの処理とメインのUIの処理で分けました。
その際に、カウントの処理の際にメインのUIを更新する関数を呼び出したいと思ったので此処の質問の答えの一部を参考に関数を作成しました。
具体的にはメインのアクティビティをインスタンス化したことだ。

ただし、呼び出し方を間違えたようで以下のようなエラーが出た。
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

その為、此処のサイト此処のサイトを参考にし
以下のように作成しました。
        runnable = new Runnable() {
            @Override
            public void run() {
                count++;
                if (count > limit_time) {
                    count = 0;
                    return;
                }
                // UIスレッドは明確に明示してやる必要がある
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        MainActivity.getInstace().updateUI(count);
                    }
                });
                handler.postDelayed(this, 1000);
            }
        };
runOnUiThreadは、activiyのメソッドの為
自作クラスで使う場合は、activityを継承してあげる必要があります。
あと、runnableの中にrunnableって使っていいというのがちょっと意外なだった。
何故駄目なのかと聞かれると何となくとしか言いようがないが。

一応のめどはついたし、今日は疲れたのでこれくらいで。

0 コメント:

コメントを投稿