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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Как запихнуть в DialogFragment список контролов? http://www.cyberforum.ru/android-dev/thread1309509.html
Хотя бы просто кнопок.В гугле из примеров,тупо только с надписями.Или у этой хрени функционала не больше чем у MessageBox , и потому это не реально ?
Программирование Android Получение своего местоположения на карте Здравствуйте. Есть небольшая проблема с получением своего местоположения на карте. Никак не могу понять, как это сделать. Что пробовал: private GoogleMap mMap; public void GoButtonClick(View... http://www.cyberforum.ru/android-dev/thread1309399.html
Использованеи materialdesign Программирование Android
Решил оформление приложения обновить под lollipop, поменял в android studio buildToolsVersion "21.0.2" поставил compile "com.android.support:appcompat-v7:21.0.2" Однако при создании темы <style...
Программирование Android Потребление памяти программы
Можно ли получить потребление памяти текущей программы? Если да, то как?
Программирование Android Определить первый пустой элемент ArrayList http://www.cyberforum.ru/android-dev/thread1309320.html
Есть ArrayList, там несколько элементов пустые, нужно определить самый первый, его индекс.
Программирование Android Не запускается эмулятор в Android Studio Всех приветствую! Последние пару недель занимаюсь установкой и настройкой Android Studio. На данный момент студия вроде бы нормально генерит проект типа "Hello world!", но запускать его в... подробнее

Показать сообщение отдельно
valerik
2 / 2 / 0
Регистрация: 10.11.2014
Сообщений: 15

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

24.11.2014, 17:56. Просмотров 808. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru