Ошибка Android Kotlin SurfaceView: отключение: не подключено (req = 2)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Ошибка Android Kotlin SurfaceView: отключение: не подключено (req = 2)

Сообщение Anonymous »

Эта ошибка не является серьезной проблемой, поскольку приложение по-прежнему работает должным образом. Мне просто любопытно. Приложение запускает фоновый цикл, который вызывает задержку(1000), а затем в потоке пользовательского интерфейса рисует SurfaceView. В этом случае, когда я нажимаю кнопку «Домой», моя поверхность разрушается, и я получаю следующую ошибку:
2024-11-09 18:55:20.898 22258-22258 BufferQueueProducer com.example.test E [SurfaceView[com.example.test/com.example.test.MainActivity]#1(BLAST Consumer)1](id:56f200000001,api:0,p:-1,c:22258) disconnect: not connected (req=2)

Если я закомментирую задержку, моя поверхность не будет разрушена, и я не получу ошибку.
Что такое причина ошибки и как ее избежать?
Спасибо за помощь.
Это минимальная воспроизводственная деятельность:
package com.example.test

import android.os.Bundle
import android.util.Log
import android.view.SurfaceHolder
import android.view.SurfaceHolder.Callback
import android.view.SurfaceView
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.ui.viewinterop.AndroidView
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.util.concurrent.Executors

class MainActivity : ComponentActivity() {

lateinit var surfaceView: SurfaceView
var isAppRunning = false
var hasSurface = false

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
surfaceView = SurfaceView(this)
surfaceView.holder.addCallback(object : Callback {
override fun surfaceCreated(p0: SurfaceHolder) {
Log.d("tag", "On surface created")
hasSurface = true
runApp()
}

override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) {
}

override fun surfaceDestroyed(p0: SurfaceHolder) {
Log.d("tag", "On surface destroyed")
hasSurface = false
}

})

setContent {
AndroidView(factory = { context ->
surfaceView
})
}
}

override fun onPause() {
super.onPause()
isAppRunning = false
}

fun runApp() {
isAppRunning = true
val executor = Executors.newSingleThreadExecutor()
executor.execute {
while (isAppRunning) {
runBlocking {
launch {
// if delay is commented out, there is no error
delay(1000)
}
}
runOnUiThread {
if (hasSurface) {
val canvas = surfaceView.holder.lockCanvas()
canvas?.let {
surfaceView.holder.unlockCanvasAndPost(canvas)
}
}
}
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... cted-req-2
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»