У меня есть класс SurfaceView, который также реализует Runnable, моя идея была:
Основной поток выдвигает изменения пользовательского интерфейса в SurfaceView. SurfaceView сохраняет эти UI-Change-Objects
в ArrayBlockingQueue
. Затем к этому BlockingQueue обращаются собственные SurfaceViews Runnable
, например:
Экран класса: SurfaceView, SurfaceHolder.Callback, Runnable {
private var isRunning = false
private var updateQueue = ArrayBlockingQueue<Task>(128)
private lateinit var surfaceHolder : SurfaceHolder
constructor(context: Context, attr: AttributeSet) : super(context, attr) {
holder.addCallback(this)
}
fun pushChanges(t: Task) {
updateQueue.add(t)
if(!isRunning) {
Thread(this).start()
}
}
override fun run() {
isRunning = true
while(updateQueue.isNotEmpty()) {
val t = updateQueue.remove()
val ctx = surfaceHolder.lockCanvas()
/* Rendering with Task t */
surfaceHolder.unlockCanvasAndPost(ctx)
}
isRunning = false
}
}
activity_main.xml
имеет экземпляр Screen
с именем renderScreen
. MainActivity
теперь переносит изменения в renderScreen
следующим образом:
renderScreen.pushChanges(task)
Считаете ли вы это хорошей идеей или есть лучшие / более производительные способы?