sadr0b0t / vkurse

Automatically exported from code.google.com/p/vkurse
0 stars 0 forks source link

Android: зависания программы #20

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
Каждый раз при переходе на новый экран или 
в горизонтальный режим долго загружается 
расписание

Original issue reported on code.google.com by zhukovsk...@gmail.com on 4 Nov 2010 at 7:14

GoogleCodeExporter commented 9 years ago
По поводу того, как можно оптимизировать 
приложение обсуждали с группой JavaME здесь: 
http://groups.google.com/group/innofivt2010/browse_thread/thread/466d2c46e8e82b6
d/13f55bdabb0d1250#13f55bdabb0d1250

Основная проблема - в большом количестве 
отдельных запросов к серверу на одном 
экране. Отчасти ситуацию можно будет 
улучшить после добавление в API метода get(int[] 
ids): http://code.google.com/p/vkurse/issues/detail?id=6, и еще 
больше улучшить после перехода на JSON: 
http://code.google.com/p/vkurse/issues/detail?id=15

Но в любом случае даже с учетом всех этих 
возможнных будущих оптимизаций нельзя 
допускать, чтобы приложение висло на 
долгих операциях - любой сетевой запрос 
автоматически попадает в этот список, т.к. 
даже самое оптимизированное приложение 
невозможно защитить от разрыва связи.

Чтобы приложение не висло и система не 
пледлагала его прибить через 5 сек - долгие 
операции нужно просто выполнять в фоновом 
потоке, плюс - во время выполнения этой 
операции желательно показывать 
немодальный прогресс-бар заголовке 
приложения. Как это сделать на андроиде 
подробно описано по этой ссылке:
http://developer.android.com/guide/practices/design/responsiveness.html
http://developer.android.com/reference/android/os/Handler.html

Вкратце - все делается очень просто. В 
класс-активити создается атрибут типа Hander:

        Handler handler = new Handler();

Чтобы в загаловке можно было крутить 
прогресс-бар, нужно в методе onCreate сделать 
так:

        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_PROGRESS);

        setContentView(R.layout.layout_file);
                ...
        }

потом долгая операция выполняется в 
фоновом потоке:

void getScheduleAnync() {
    final Thread thread = new Thread() {
        @Override
        public void run() {
            // получить расписание по сети (займет долгое время)
            final Schedule schedule = getScheduleFromNetwork();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    // убрать прогресс-бар из заголовка
                    getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_OFF);
                    getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_INDETERMINATE_ON);

                    // показать информацию о расписании в интерфейсе
                    displayScheduleInGUI(schedule);
                }
            });
        }
    }

    // показать прогресс-бар в заголовке:
    getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
    getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_INDETERMINATE_ON);

    // запустить поток
    thread.start();
}

Нужно обратить внимание на то, как 
используется объект handler - после того, как 
долгая операция по загрузке расписания 
закончилась, из фонового потока вызывается 
метод handler.post(Runnable) - это операция будет 
выполнена уже в обычном потоке GUI, а не в 
фоне, т.к. любые модификации элементов 
управления можно делать только из этого 
главного потока.

Original comment by bender...@gmail.com on 5 Nov 2010 at 2:33

GoogleCodeExporter commented 9 years ago

Original comment by bender...@gmail.com on 5 Nov 2010 at 2:34

GoogleCodeExporter commented 9 years ago
[deleted comment]
GoogleCodeExporter commented 9 years ago
Кстати, загрузку расписания и информации о 
предмете в фоновом потоке я сделала, только 
на сколько это ускорило работу приложения 
пока оценить не удалось ввиду отсутствия 
данных в базе, но по крайней мере черный 
экран приложение не показывает)

Vkurse_demo_v1.01..rar - загрузка в фоновом потоке 
только расписания
Vkurse_demo_v1.02.rar - расписание и информация о 
предмете в фоновом потоке

Original comment by olga.tit...@gtempaccount.com on 17 Nov 2010 at 9:52

GoogleCodeExporter commented 9 years ago
Супер, спасибо - у меня вроде работает.

Скорость работы программы фоновый поток не 
увеличит, но зато предотвратит зависание 
интерфейса во время выполнения долгой 
задачи (что собственно и было сделано).

Original comment by bender...@gmail.com on 17 Nov 2010 at 10:10