Android: имеет ли смысл реализовывать SurfaceView как Runnable с очередью обработки? - PullRequest
0 голосов
/ 05 октября 2019

У меня есть класс 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)

Считаете ли вы это хорошей идеей или есть лучшие / более производительные способы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...