Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Cтатус бар


Автор: smke444 25.5.2009, 15:17
Нужна помощь по организации логики заставки SplashScreen .

То есть главный поток который инициализирует данные и есть параллельный поток который показывает в это время  заставку и процесс загрузки скажем в виде статус бара загрузки – скажем как во многих играх от Gameloft

Суть проблемы – как отобразить в статус баре пропорциональность загрузки ресурсов (как на играх от Gameloft или как в флеше).

Нужна всего лишь логика реализации... Заранее спасибо

Автор: eugine_s 25.5.2009, 15:53
Логика: поток 1 (который загружает ресурсы)  знает (если не знает, значит нужно его научить, чтобы знал smile) сколько ресурсов он загрузил. потоку 2 нужно знать сколько было загружено. 
Суть задачи из потока1 передать в поток2 какое-то число (или потоку2 забрать из потока1 число). 
Я бы в потоке2 реализовал какой-то Listener и в потоке1 информировал бы этот листенер о событии.


Автор: smke444 25.5.2009, 17:43
Ну допустим логика понятна , но все-таки как-то нескладно это.
Допустим в 1 потоке у меня 20 загрузок изображений и больших и маленьких – в этом случае как быть? Сделать универсальный метод лоадер для картинок, рассчитать общую величину загружаемых картинок и в зависимости от объема картинки информировать об этом listener... Ну помимо картинок есть и RMS и может другие тяжелые процессы – здесь с подсчетом времени загрузки будет по тяжелей....

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

В принципе если нет других подходов – Вопрос снят. Спасибо 

Автор: math64 26.5.2009, 09:25
Код

public interface Resource {
void load();
int getWeight();
}
void load(Resourse[] resourses) {
  long[] loadTimes = new long[resourses.length];
  int totalWeight = 0;
  for (int i= 0; i < resourses.length; i++) totalWeight += resourses.getWeight();
  long start = System.currentTimeMillis();
  int weight = 0;
  for (int i= 0; i < resourses.length; i++) {
    System.out.println(weight + " of " + totalWeight + " loaded");
    resourses[i].load();
    weight += resourses.getWeight();
    long end = System.currentTimeMillis();
    loadTimes[i] = start - end;
    start = end;
    System.out.println(loadTimes[" + i + "] = " loadtimes[i]);
  }
}

Запустить на эмуляторе.
А потом использовать распечатанное время загрузки для определения веса ресурса. Для разных моделей телефона они вряди будут сильно отличаться (а если отличается - создать отдельный jar для этой модели)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)