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 コメント:
コメントを投稿