Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для zhigarartem
11 / 10 / 1
Регистрация: 04.03.2014
Сообщений: 29

Проблема отрисовки в SurfaceView после события onResume

11.04.2023, 13:59. Показов 504. Ответов 0

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Пытаюсь написать игру для Android на Kotlin.

Сначала использовал View и вызывал .invalidate() для отрисовки.
Получил 30 FPS.

Потом нашёл SurfaceView, в котором отрисовка делается в отдельном потоке.
Получил 60 FPS, делая по этому примеру: https://www.youtube.com/watch?v=xoWY-qD9DOQ

Но столкнулся с проблемой. Опишу, что делается в программе:
1. Запускаю приложение
2. Вызывается onResume
3. Срабатывает surfaceCreated
4. Запускаю поток для отрисовки
5. Срабатывает surfaceChanged (holder такой же как и в surfaceCreated)
6. Рисую анимацию с 60 FPS

7. Сворачиваю приложение
8. Срабатывает surfaceDestroyed
9. Пробовал приостанавливать отрисовку или завершать поток отрисовки

10. Восстанавливаю приложение
11. Вызывается onResume
12. Не срабатывает surfaceCreated

И вот тут мне нужно продолжить отрисовку.
Но поскольку не сработал callback surfaceCreated - я не знаю новый holder для .lockCanvas().
А обращение к старому holder вызывает IllegalStateException: Surface has already been released


Вот мой код (без приостановки отрисовки и завершения потока):

activity_main.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
    <com.company.temp.MySurfaceView
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
package com.company.temp
 
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
 
class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}
MySurfaceView.kt
Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.company.temp
 
import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.SurfaceHolder
import android.view.SurfaceView
 
class MySurfaceView : SurfaceView, SurfaceHolder.Callback {
 
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) :
            super(context, attrs, defStyleAttr)
 
    init {
        holder.addCallback(this)
    }
 
    private val runnable = Runnable {
        while (true) {
            val canvas = holder?.lockCanvas()
            canvas?.drawColor(Color.BLACK)
            holder?.unlockCanvasAndPost(canvas)
        }
    }
    private var thread = Thread(runnable)
 
 
    override fun surfaceCreated(holder: SurfaceHolder) {
        thread.start()
    }
 
    override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
    }
 
    override fun surfaceDestroyed(holder: SurfaceHolder) {
    }
}

Подскажите, как мне продолжить отрисовку после восстановления приложения?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.04.2023, 13:59
Ответы с готовыми решениями:

Изменение style у Button после события onResume
Существует кнопка button. Существуют отличимые стили R.style.b1 и R.style.b2. Вопрос: каким...

Метод фрагмента onResume() перестает вызываться после вызова метода recreate() для Activity
Такая проблема:после вызова метода recreate() методы фрагментов onCreate() and onCreateView()...

Android: как не перезагружать webview в activity при OnResume?
Описание проблемы: есть activity A (основная android.intent.category.LAUNCHER). Есть activity B, в...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.04.2023, 13:59
Помогаю со студенческими работами здесь

Зачем нужно два onResume() в Активити?
Всем привет! Ну вот и настал великий день, когда я вышел за пределы вопросов про упражнения из...

Не передаются данные между onCreate и onResume
Значение переменной изменяется после загрузки. НО! В onCreate есть TextView который использует это...

SurfaceView при изменении ориентации экрана перегружается
при создании тетриса возник вопрос. один из моих классов расширяет класс SurfaceView public...

SurfaceView + onKeyDown
Проблемка очень простая - не реагирует на onKeyDown в классе, наследующем SurfaceView. Исправьте...

Простейший пример SurfaceView
Здравствуйте. Напишите пожалуйста простейшую программу рисующую точку на экране с помощью...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru