Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
valerik
2 / 2 / 0
Регистрация: 10.11.2014
Сообщений: 15
#1

Выполнение кода в отдельном потоке

24.11.2014, 17:56. Просмотров 975. Ответов 2
Метки нет (Все метки)

Добрый день!
Изучаю программирование на андроид, написал тестовую программку где отрисовка происходит в отдельном потоке.
Вроде работает. Проблема возникает при сворачивании программы кнопкой HOME. При разворачивании программы выдаёт исключение:

SurfaceView - surfaceCreated -﹕ java.lang.IllegalThreadStateException: Thread already started.

Причём через кнопку "Назад" программа тоже сворачивается и проблем не возникает.
Вот кусок кода

Java
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
public class GameView extends SurfaceView {
 
    /**
     * Наше поле рисования
     */
    private SurfaceHolder holder;
    private Game game;
 
    /**
     * Объект класса GameManager
     */
    private GameManager gameLoopThread;
 
 
    public GameView(final Activity activity) {
        super(activity);
        game = Game.getInstance(this);
 
 
        gameLoopThread = new GameManager(this);
        holder = getHolder();
        holder.addCallback(new SurfaceHolder.Callback() {
            /** Создание области рисования */
            public void surfaceCreated(SurfaceHolder holder) {
                Log.i("SurfaceView", "surfaceCreated");
                gameLoopThread.setRunning(true);
                try {
                    gameLoopThread.start();
                } catch (Exception e) {
                    Log.i("SurfaceView - surfaceCreated -", e.toString());
                }
 
            }
 
            /** Изменение области рисования */
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                Log.i("SurfaceView", "surfaceChanged");
            }
 
            /** Уничтожение области рисования */
            public void surfaceDestroyed(SurfaceHolder holder) {
                Log.i("SurfaceView", "surfaceDestroyed");
                //gameLoopThread.setRunning(false);
                //gameLoopThread.interrupt();
                boolean retry = true;
                gameLoopThread.setRunning(false);
                gameLoopThread.interrupt();
                while (retry) {
                    try {
                        gameLoopThread.join();
                        retry = false;
                    } catch (InterruptedException e) {
                    }
                }
            }
 
        });
    }
 
    //Отрисовка игрового поля
    @Override
    protected void onDraw(Canvas canvas) {
        try {
            game.draw(canvas);
        } catch (Exception e) {
            Log.i("Ошибка отрисовки ", e.toString());
        }
    }
}
Вот что пишется в логи:
при запуске приложения:
MainActivity﹕ onCreate
SurfaceView﹕ surfaceCreated
SurfaceView﹕ surfaceChanged
Далее сворачиваем кнопкой "Назад"
SurfaceView﹕ surfaceDestroyed
MainActivity﹕ onDestroy
Далее разворачиваем
MainActivity﹕ onCreate
SurfaceView﹕ surfaceCreated
SurfaceView﹕ surfaceChanged
(Т.е. тут происходит тоже самое, что при первом запуске программы)
Сворачиваем кнопкой HOME
SurfaceView﹕ surfaceDestroyed
(т.е. не выполняется MainActivity: onDestroy)
Разворачиваем
SurfaceView﹕ surfaceCreated
SurfaceView - surfaceCreated -﹕ java.lang.IllegalThreadStateException: Thread already started.
SurfaceView﹕ surfaceChanged
И вот тут видим, что Маин активити не пересоздаётся и в surfaceCreated вылетает исключение, мол поток уже запущен. Я пробовал останавливать поток и перезапускать его.. не выходит. В итоге на экране ничего не отрисовывается, что должно отрисовываться в этом потоке.

В чём тут касяк?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2014, 17:56
Ответы с готовыми решениями:

Как отменить выполнение кода в сервисе, который запущен в отдельном потоке?
Здравствуйте! Есть код класса, наследующего Service public int...

Отрисовка данных в отдельном потоке
Уважаемые гуру и простые хорошие ребята, подскажите как правильно реализовать...

Создание view элементов в отдельном потоке
Беру данные из интернета и делаю блоки. Если информации довольно много то при...

Загрузка в ImageView картинки по ссылке в отдельном потоке. Исправить код
Здравствуйте! Пытаюсь загрузить картинку по ссылке из инета в ImageView в...

Остановить выполнение кода
Добрый день уважаемые написал такой код: ...

2
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 893
25.11.2014, 08:50 #2
valerik, Вам следует ознакомится для начала с жизненным циклом приложения. А после этого написать код, соответствующий вашей ситуации в:
onResume()
onPause() итд.
1
valerik
2 / 2 / 0
Регистрация: 10.11.2014
Сообщений: 15
25.11.2014, 17:13  [ТС] #3
androbro, спасибо, добавил в onResume кой какой код и вроде заработало
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2014, 17:13

Прервать выполнение кода до закрытия диалога
Кнопка "создать документ". Нужно сделать диалог-предупреждение типа "введенные...

Рисование в отдельном Layout
Как по нажатию на кнопку нарисовать линию (допустим) в отдельном каком-то...

Сервис в отдельном процессе
Здравствуйте. Как определить из приложения запущен или остановлен сервис,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru