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

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

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

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

24.11.2014, 17:56. Просмотров 774. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выполнение кода в отдельном потоке (Программирование Android):

Как отменить выполнение кода в сервисе, который запущен в отдельном потоке? - Программирование Android
Здравствуйте! Есть код класса, наследующего Service public int onStartCommand(Intent intent, int flags, int startId) { tTask = new...

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

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

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

Остановить выполнение кода - Программирование Android
Добрый день уважаемые написал такой код: txt=myEdit.getText().toString(); txtlength=txt.length(); if (txtlength==0){ ...

Сервис в отдельном процессе - Программирование Android
Здравствуйте. Как определить из приложения запущен или остановлен сервис, находящийся в другом процессе? Добавлено через 27 минут...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
androbro
326 / 286 / 60
Регистрация: 17.10.2014
Сообщений: 843
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 - Программирование Android
Как по нажатию на кнопку нарисовать линию (допустим) в отдельном каком-то layout.

Выполнение кода в отдельном потоке - C# WPF
Итак есть форма. На ней кнопочка. Под кнопочкой трудоемкий алгоритм. Я хочу чтобы при нажатии на кнопочку запускался алгоритм в не главном...

Выполнение кода в отдельном потоке - Delphi
Есть код программы. Хотел бы полюбоваться красивым видом, но тут столкнулся с проблемой .... Вот код: procedure...

Выполнение в отдельном потоке - Java
Необходимо реализовать выполнение данного класса в отдельном потоке. У меня никак не выходит, прошу помощи) import java.awt.Color; ...


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

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

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