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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.97
aaleksander
110 / 84 / 1
Регистрация: 06.06.2011
Сообщений: 397
Записей в блоге: 1
#1

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

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

Добрый вечер уважаемые.
не могу решить вот такую проблему:
Сделал пример отсюда: http://megadarja.blogspot.com/2009/0...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
программа в Android Studio. Из приложения вырезал практически все. 5 часов экспериментировал так и не понял из за чего.Единственное...

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

Кнопка "Стереть данные", как от нее защититься? - Программирование Android
В настройках приложения есть кнопка &quot;Стереть данные&quot;, она удаляет все данные (в том числе и sql) приложения. 1 Есть ли способ...

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

Кнопка "Показать на карте" и MapActivity - Программирование Android
Всем привет, возник такой вопрос. У меня есть список магазинов в RecyclerView во фрагменте. Хочу сделать под каждым магазином надпись...

Кнопка "Back" для приложения - Программирование Android
у меня есть несколько форм и мне необходима кнопка которая будет возвращать меня к предыдущей форме я не знаю как это сделать кто знает...

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

Твоего вопроса там нет, но реализовывать все без онПаузе и онСтоп можно спокойно, они не обязательны.
1
aaleksander
110 / 84 / 1
Регистрация: 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 / 5
Регистрация: 08.12.2010
Сообщений: 421
12.04.2012, 18:42 #5
Цитата Сообщение от Rebelx Посмотреть сообщение
Вопрос почти в тему - как сделать layout, который был бы разным в ландшафте, в зависимости от направления поворота?
т.е. я хочу сделать кнопки:
Портрет - внизу, где home
Ландшафт - или слева или справа, где home
используйте layout-port и layout-land
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2012, 18:42
Привет! Вот еще темы с ответами:

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

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

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

Не работает кнопка "Home" - Программирование Android
Здравствуйте. Аппаратные кнопки можно обрабатывать через KeyEvent например так @Override public boolean onKeyDown(int...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
12.04.2012, 18:42
Ответ Создать тему
Опции темы

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