Android開発を行っていたところ、処理が重い部分がメインスレッドの進行を遅らせているので、非同期処理について勉強しています。
試しにExecutorServiceのSingleThreadExecutor上で処理を実行してみたところ、メインスレッドはスムーズに動くようになりましたが、Executor上では処理が蓄積されていき数秒遅れで実行されている状態です。
理想としては、メインスレッドから受け取った値を別スレッド上で処理し、処理が完了したらメインスレッドに値を返し、再度受け取った値で同じ処理を行う、これの繰り返しといった感じです。
Executorの処理が完了していない状態で、再度同じExecutorが呼ばれると処理が溜まっていくのでしょうか。
ご教授いただければ幸いです。
”追記”
大まかな流れとしては以下の通りです。
メインスレッド上ではUI更新の他にも処理を行っているので、一連の流れをすべてメインスレッド上で行うとそちらに支障が出てきます。
なので、比較的重い計算処理を2つに分割し、計算が完了次第メインスレッドで受け取るという形にしたいです。
以下の構成だと、メインスレッドは良好ですが、Executor上では過去の処理命令が蓄積されていき、時間が経つにつれて遅延が発生する状態になっています。
理想としては、Executor1, Executor2のそれぞれにおいて、呼び出し時に空き状態であれば最新のセンサーの値を受け取り計算を実行、実行状態であれば命令を無視できるようにしたいです。(Executor1とExecutor2の計算内容は別物です)
理解が浅いので初歩的な間違いがあれば申し訳ないです。
private var sensor1: Float = null ・・・センサー1の値を格納 private var sensor2: Float = null ・・・センサー2の値を格納 private var result1 : Int = null ・・・計算処理1の結果を格納 private var result2 : Int = null ・・・計算処理2の結果を格納 override fun onInitialized(){ calcExecutor1 = Executors.newSingleThreadExecutor() calcExecutor2 = Executors.newSingleThreadExecutor() } // ------ここから繰り返し処理-------- ・センサーから値を取得しsensor1,sensor2を更新 ・値を計算処理するためにExecutorに値を渡す calcExecutor1.execute { result1 = calculate1( sensor1 )・・・calculate1ではこの引数をもとに計算を実行 } calcExecutor2.execute { result2 = calculate2( sensor2 )・・・calculate2ではこの引数をもとに計算を実行 } ・result1 , result2がnullでなければ値を処理(軽)した後に画面に表示 // -------ここまで繰り返し処理--------- override fun onDestroyView() { calcExecutor1.shutdown() calcExecutor2.shutdown() }

回答2件
あなたの回答
tips
プレビュー