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

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

Восстановить пароль Регистрация
Другие темы раздела
Android Как запихнуть в DialogFragment список контролов? http://www.cyberforum.ru/android-dev/thread1309509.html
Хотя бы просто кнопок.В гугле из примеров,тупо только с надписями.Или у этой хрени функционала не больше чем у MessageBox , и потому это не реально ?
Android Получение своего местоположения на карте Здравствуйте. Есть небольшая проблема с получением своего местоположения на карте. Никак не могу понять, как это сделать. Что пробовал: private GoogleMap mMap; public void GoButtonClick(View view) { mMap.getMyLocation(); } Данный способ крашится при вызове в программе по нажатию на кнопку. 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 name="AppThemeMaterial" parent="android:Theme.Material"> <!-- Customize the Material elements here --> </style> выдает такую ошибку - android:Theme.Material requires API level 21...
Android Потребление памяти программы
Можно ли получить потребление памяти текущей программы? Если да, то как?
Android Определить первый пустой элемент ArrayList http://www.cyberforum.ru/android-dev/thread1309320.html
Есть ArrayList, там несколько элементов пустые, нужно определить самый первый, его индекс.
Android Не запускается эмулятор в Android Studio Всех приветствую! Последние пару недель занимаюсь установкой и настройкой Android Studio. На данный момент студия вроде бы нормально генерит проект типа "Hello world!", но запускать его в эмуляторе не хочет. После запуска пишет в логе C:\Android\android-sdk\tools\emulator.exe -avd Default_Nexus_5 -netspeed full -netdelay none и больше ничего не происходит. Никакого окна с эмуляцией не... подробнее

Показать сообщение отдельно
valerik
2 / 2 / 0
Регистрация: 10.11.2014
Сообщений: 14
24.11.2014, 17:56     Выполнение кода в отдельном потоке
Добрый день!
Изучаю программирование на андроид, написал тестовую программку где отрисовка происходит в отдельном потоке.
Вроде работает. Проблема возникает при сворачивании программы кнопкой 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 вылетает исключение, мол поток уже запущен. Я пробовал останавливать поток и перезапускать его.. не выходит. В итоге на экране ничего не отрисовывается, что должно отрисовываться в этом потоке.

В чём тут касяк?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru