Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
valerik
2 / 2 / 0
Регистрация: 10.11.2014
Сообщений: 15
#1

Выполнение кода в отдельном потоке - Программирование Android

24.11.2014, 17:56. Просмотров 762. Ответов 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 вылетает исключение, мол поток уже запущен. Я пробовал останавливать поток и перезапускать его.. не выходит. В итоге на экране ничего не отрисовывается, что должно отрисовываться в этом потоке.

В чём тут касяк?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2014, 17:56     Выполнение кода в отдельном потоке
Посмотрите здесь:
Android Как отменить выполнение кода в сервисе, который запущен в отдельном потоке?
Отрисовка данных в отдельном потоке Android
Android Создание view элементов в отдельном потоке
Android Загрузка в ImageView картинки по ссылке в отдельном потоке. Исправить код
Android Остановить выполнение кода
Android Рисование в отдельном Layout
Android Сервис в отдельном процессе
Неуправляемый onDraw в отдельном View компоненте Android
Как в отдельном классе сохранять переменные? Android
Android Как из Thread в отдельном классе получить context приложения?
Android Не получается открыть диалоговое окно, созданное в отдельном классе
Android Создание 2-х таблиц в одной SQL db и отображение в отдельном табе TabActivity

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 839
25.11.2014, 08:50     Выполнение кода в отдельном потоке #2
valerik, Вам следует ознакомится для начала с жизненным циклом приложения. А после этого написать код, соответствующий вашей ситуации в:
onResume()
onPause() итд.
valerik
2 / 2 / 0
Регистрация: 10.11.2014
Сообщений: 15
25.11.2014, 17:13  [ТС]     Выполнение кода в отдельном потоке #3
androbro, спасибо, добавил в onResume кой какой код и вроде заработало
Ответ Создать тему
Опции темы

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