Closed GoogleCodeExporter closed 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
Original comment by bender...@gmail.com
on 5 Nov 2010 at 2:34
[deleted comment]
Кстати, загрузку расписания и информации о
предмете в фоновом потоке я сделала, только
на сколько это ускорило работу приложения
пока оценить не удалось ввиду отсутствия
данных в базе, но по крайней мере черный
экран приложение не показывает)
Vkurse_demo_v1.01..rar - загрузка в фоновом потоке
только расписания
Vkurse_demo_v1.02.rar - расписание и информация о
предмете в фоновом потоке
Original comment by olga.tit...@gtempaccount.com
on 17 Nov 2010 at 9:52
Супер, спасибо - у меня вроде работает.
Скорость работы программы фоновый поток не
увеличит, но зато предотвратит зависание
интерфейса во время выполнения долгой
задачи (что собственно и было сделано).
Original comment by bender...@gmail.com
on 17 Nov 2010 at 10:10
Original issue reported on code.google.com by
zhukovsk...@gmail.com
on 4 Nov 2010 at 7:14