Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.97
aaleksander
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 397
Записей в блоге: 1
#1

Кнопка "домой", смена ориентации и прочее :) - Программирование Android

11.04.2012, 11:43. Просмотров 4054. Ответов 4
Метки нет (Все метки)

Добрый вечер уважаемые.
не могу решить вот такую проблему:
Сделал пример отсюда: http://megadarja.blogspot.com/2009/03/android-1-surface.html

Там к комментариях правильно сказано, что если нажать домой, то при повторном запуске, приложение валится с ошибкой.
Сделал у активи с поверхностью метод:
Java
1
2
3
4
5
    @Override
    public void onStop(){
        super.onStop();
        finish();
    }
Падать перестала, но зато теперь эквити при смене ориентации экрана выходит в эту процедуру и, естественно завершает работу.
Т.е. получается такая ситуация: у меня в программе в главном эквити (оно же меню) есть кнопка "Показать как график". Я её жму, попадаю на график, поворачиваю телефон и вновь оказываюсь в главном меню.
Если onStop убрать, то поверхность перерисовывается согласно ориентации экрана, но зато валится при повторном запуске.
Подскажите, какое условие нужно поставить в onStop, чтобы эквити знало, что я просто повернул телефон, а не нажал кнопку "домой".

Спасибо.

Добавлено через 17 часов 58 минут
Кое-что вырисовывается.
Выдает такую ошибку:
java.lang.IllegalThreadStateException: Thread already started.
at java.lang.Thread.start(Thread.java:1322)
at com.android.graph.Chart.surfaceCreated(Chart.java:55)
at android.view.SurfaceView.updateWindow(SurfaceView.java:532)
at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:206)
at android.view.View.dispatchWindowVisibilityChanged(View.java:3891)
Т.е. повторно пытается запустить поток для рисования.
Переделал процедуру запуска вот так:
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
    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {//запускаем поток рисования
        if( mThread.getRunning() == false ){
            mThread.setRunning(true);
            mThread.start();    <-------вот тут падает
        }
    }
 
    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {//прибиваем поток рисования
        boolean retry = true;
        mThread.setRunning(false);
        while (retry)
        {
            try
            {
                // ожидание завершение потока
                mThread.join();
                retry = false;
            }
            catch (InterruptedException e) { }
        }       
    }
Но проблемма осталась. Т.е. getRunning возвращает false, и пытается запустить уже запущенный поток.

Поток вроде тоже реализован правильно:
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
        /**
         * Задание состояния потока
         * @param running
         */
        public void setRunning(boolean running)
        {
            mRunning = running;
        }
        
        public boolean getRunning()
        {
            return mRunning;
        }
 
        @Override
        /** Действия, выполняемые в потоке */
        public void run()
        {
            while (mRunning)
            {
                Canvas canvas = null;
                try
                {
                    // подготовка Canvas-а
                    canvas = mSurfaceHolder.lockCanvas();
                    synchronized (mSurfaceHolder)
                    {
                        // собственно рисование
                        draw(canvas);                        
                    }
                }
                catch (Exception e) { }
                finally
                {
                    if (canvas != null)
                    {
                        mSurfaceHolder.unlockCanvasAndPost(canvas);
                    }
                }
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2012, 11:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Кнопка "домой", смена ориентации и прочее :) (Программирование Android):

При смене ориентации на land программа "вылетает"
программа в Android Studio. Из приложения вырезал практически все. 5 часов...

Глючит кнопка Домой. Что делать?
У меня LG L Fino .Сегодня заметил что начала глючить кнопка home .Бывает вообще...

Кнопка "Стереть данные", как от нее защититься?
В настройках приложения есть кнопка &quot;Стереть данные&quot;, она удаляет все данные (в...

Свой Launcher. Срабатывает кнопка "назад"
Здравствуйте! -Пишу свой простенький Laucher(во многом опирался на этот...

Кнопка "Back" для приложения
у меня есть несколько форм и мне необходима кнопка которая будет возвращать...

Кнопка "Показать на карте" и MapActivity
Всем привет, возник такой вопрос. У меня есть список магазинов в RecyclerView...

4
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
11.04.2012, 23:25 #2
Все реализовано правильно, просто убери онСтоп, у дарьи все работает без него, сам учился по её урокам, но мало что полезного вынес. Вот тут я писал как делать игру под android, почитай я думаю объясняю понятно.

Твоего вопроса там нет, но реализовывать все без онПаузе и онСтоп можно спокойно, они не обязательны.
1
aaleksander
111 / 85 / 21
Регистрация: 06.06.2011
Сообщений: 397
Записей в блоге: 1
12.04.2012, 09:13  [ТС] #3
У Дарьи не запускается повторно, если вышел из апликухи по клавише "домой". Я пока просто пересоздаю поток, вроде работает. Сейчас почитаю твою статью.
Спасибо.
0
Rebelx
3 / 3 / 0
Регистрация: 13.10.2009
Сообщений: 40
12.04.2012, 15:05 #4
Вопрос почти в тему - как сделать layout, который был бы разным в ландшафте, в зависимости от направления поворота?
т.е. я хочу сделать кнопки:
Портрет - внизу, где home
Ландшафт - или слева или справа, где home
0
silentnuke
Android Programmer
139 / 140 / 10
Регистрация: 08.12.2010
Сообщений: 421
12.04.2012, 18:42 #5
Цитата Сообщение от Rebelx Посмотреть сообщение
Вопрос почти в тему - как сделать layout, который был бы разным в ландшафте, в зависимости от направления поворота?
т.е. я хочу сделать кнопки:
Портрет - внизу, где home
Ландшафт - или слева или справа, где home
используйте layout-port и layout-land
0
12.04.2012, 18:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2012, 18:42
Привет! Вот еще темы с решениями:

Смена ориентации экрана
в папке layout файл screen.xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;...

Не работает кнопка "Home"
Здравствуйте. Аппаратные кнопки можно обрабатывать через KeyEvent например так ...

Системная кнопка "Назад"
как научить программу реагировать на нажатие этой самой кнопки?

Таймер. Кнопка "Пауза"
Вобщем, решил попробовать сделать таймер, нашел статью, вроде все получилось,...


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

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

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