Translate

BTemplates.com

Powered by Blogger.

2017年12月5日火曜日

2017-12-05、06 到達点メモ


Java → Kotlinの翻訳一覧

MainActivity.this → this@MainMainActivity
MyJobService.class.getName() → MyJobService::class.java.name


*下記は全部、基本的にKotlinに書き直して書いています。

Example of JobScheduler and JobService
探して見つけた一番簡単なサンプル。
ただし、これだとjobschedulerが本当動いているかわからない
やり方が悪い可能性もあるが、onStartJobが動いているようには見えない


How to use Android's Job Scheduler
上記のサイトのサンプル
同じように試してみたがどうも動いているように見えない

JobSchedulerの使い方
Kotlinで書き換えたところ一部でうまく書き換えができないところが出てきた。
具体的にいうとstatic部分。
一方で、そのままJavaだと動くことが確認できた。
で、調べなおしたところ、やはりstatic部分が原因だった。
対処方法的な話をするとstaticにしたい場所を
 companion object {}
で囲めばよい。

参考サイト:Kotlinにstaticが無いのなんで?(Why doesn't Kotlin have static members inside a class?)

jobFinished()でスケジュールを終了させることができる
scheduler.cancel()を呼ぶことで、onStopJobが呼ばれる。
スケジュールを終了させた後でscheduler.cancel()してもonStopJobは呼ばれない。

で、色々試した結果、JobSchedulerを使ってタイマー処理を行えることを確認できた。
自分にとって盲点だったのが、タイマー処理をする際に定期的に処理をしなくてはいけないので、JobSchedulerを使う際にJobSchedulerそのものを定期的に呼ばないといけないと勘違いしていた。
実際は、JobSchedulerで定期的に自身(JobSchedulerの事ではない)を呼ぶスレッドを呼ぶように設定すればよいと気が付いた。
もしかするとAlarmManagerとかでも同じように応用できるかもしれない。

個人的につまずいた部分として、MainActivtyのメソッドを別のクラスで読んでいたため
それを明示的に宣言しないといけないのだが
VoiceTimerで使っていた以下のような書き方では使えなかった。

 runOnUiThread { MainActivity.instace!!.updateUI(now_sec) }

*MainActivtyで、以下のように宣言しており、また、onCreateでinstace=thisを宣言している。
    companion object {
        var instace: MainActivity? = null
    }

理由は、JobSchedulerを読んでいるクラスでActivtyを継承していなかったため。
すでに、JobService()を継承しているため、Activtyは継承できない。
その為、別の方法を取る必要がある。具体的には、以下のように書けばActivtyを継承していなくても動くことが確認できた。
MainActivity.instace!!.runOnUiThread{ MainActivity.instace!!.updateUI(now_sec) }

参考サイト:Cannot resolve method .runOnUiThread

いやぁ、何とかなりそうで本当に良かった。
明日、VoiceTimerの方に実装してテストしてみて問題が無さそうであれば
近日実装できるかと思います。

今日はここまで



0 コメント:

コメントを投稿