Гость
Форумы / Android [игнор отключен] [закрыт для гостей] / Android. Обновление Activity по таймеру / 14 сообщений из 14, страница 1 из 1
23.12.2011, 17:35
    #37591238
AYTereschenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
Так как все-таки правильно обновлять какие-то данные на экране по периодическому событию? Например надо раз в минуту запрашивать из инета данные и обновлять цифры в приложении. Какие шаги надо для этого предпринять?
Данные же на экране можно обновлять только из главного UI-треда, как я понял. Как это реализовать?
Сделать сервис, который будет раз в минуту доставать из инета данные и при помощи Intent отправлять их в BroadcastReceiver, в котором и обновлять данные на экране? А как в сервисе реализовать задержку в 1 минуту? Там есть что-то наподобие Thread.sleep() или надо другой способ применять?
...
Рейтинг: 0 / 0
23.12.2011, 17:49
    #37591258
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
а там нет обычного таймера?

Код: java
1.
2.
3.
4.
5.
Timer.scheduleAtFixedRate(new TimerTask() {
  public void run() {
    // доставать из инета данные и при помощи Intent отправлять их в BroadcastReceiver
  }
}, 0, 60 * 1000);
...
Рейтинг: 0 / 0
23.12.2011, 17:50
    #37591263
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
данные реально раз в минуту обновляются? если нет, то push. а вообще у тебя слишком много вопросов в одном предложении. некие телодвижения в отдельном потоке с обновлением гуя? AsyncWorker. Сервис - точно ли он нужен, или обновлять нужно пока приложение открыто? Периодически? в андроидной jvm таймеры организуются так же как и в жабе. Поступающие данные интересны только твоему аппу? если да, то зачем Broadcast?

p.s. надо определиться с архитектурой для начала.
...
Рейтинг: 0 / 0
23.12.2011, 17:59
    #37591277
AYTereschenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
chpashaданные реально раз в минуту обновляются? если нет, то push.
Да, обновляются раз в минуту. А что за push?
а вообще у тебя слишком много вопросов в одном предложении. некие телодвижения в отдельном потоке с обновлением гуя? AsyncWorker.
chpashaСервис - точно ли он нужен, или обновлять нужно пока приложение открыто? Периодически?
Только пока приложение открыто, периодически, раз в минуту. Если сервис не нужен, то что взамен?
chpashaПоступающие данные интересны только твоему аппу? если да, то зачем Broadcast?
Да, интересны только моему. Если не броадкаст, то что взамен? Я видел в документации некий android.support.v4.content.LocalBroadcastManager, но у меня его нет в classpath'е.
...
Рейтинг: 0 / 0
23.12.2011, 18:57
    #37591362
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
AYTereschenkoДа, обновляются раз в минуту. А что за push?
push это когда сервер уведомляет тебя об изменениях, а не ты дергаешь его периодически. но если у тебя данные обновляются раз в минуту, то про пуш забыли, просто дергай сервер раз в минуту

AYTereschenkoТолько пока приложение открыто, периодически, раз в минуту. Если сервис не нужен, то что взамен?
имхо достаточно фонового потока. стартуем по таймеру AsyncWorker, когда он возвращает результат - обновляем данные. в той вьюхе где это нужно. можно в отдельный класс и подписаться во вьюхе на событие обновления данных. последний вариант аккуратней, чем все в представление пихать. сервис имеет смысл, если надо делать что-то в фоне даже если апп закрыт (например аплоад файла и т.п.).

AYTereschenkoДа, интересны только моему. Если не броадкаст, то что взамен? читай про
How do I pass data between Activities/Services within a single application?
...
Рейтинг: 0 / 0
23.12.2011, 19:55
    #37591447
AYTereschenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
chpasha,

Ну вроде все понятно, кроме одного: как "подписаться во вьюхе на событие обновления данных"?
...
Рейтинг: 0 / 0
24.12.2011, 02:03
    #37591741
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
Если service не устраивает, посмотри в сторону AsyncTask, через него можно обновлять UI.
Хотя imho service гибче,т.к. если не требуется сегодня,может завтра понадобится.
...
Рейтинг: 0 / 0
24.12.2011, 13:04
    #37591855
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
AYTereschenkochpasha,

Ну вроде все понятно, кроме одного: как "подписаться во вьюхе на событие обновления данных"?
паттерн листенер (observer), он ведь в апи андроида повсюду ;)
...
Рейтинг: 0 / 0
24.12.2011, 19:05
    #37592075
AYTereschenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
chpasha,

А, ну я думал, что должны быть какие-то встроенные средства для безопасного апдейта UI из фоновых потоков. Нашел Handler#sendMessage(). По-моему это оно самое.
...
Рейтинг: 0 / 0
25.12.2011, 12:59
    #37592505
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
AYTereschenkoА, ну я думал, что должны быть какие-то встроенные средства для безопасного апдейта UI из фоновых потоков. Нашел Handler#sendMessage(). По-моему это оно самое.
Как я уже писал выше
AsyncTask-это как раз то, что вы хотите , а именно "встроенные средства для безопасного апдейта UI из фоновых потоков".
...
Рейтинг: 0 / 0
26.12.2011, 13:04
    #37593371
AYTereschenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
TrogloditAYTereschenkoА, ну я думал, что должны быть какие-то встроенные средства для безопасного апдейта UI из фоновых потоков. Нашел Handler#sendMessage(). По-моему это оно самое.
Как я уже писал выше
AsyncTask-это как раз то, что вы хотите , а именно "встроенные средства для безопасного апдейта UI из фоновых потоков".

В документации к AsyncTask сказано, что создавать и выполнять его можно только из UI-потока. А мне же нужно из фонового потока задачу выполнять, по таймеру. Использовать для этого Activity.runOnUiThread(Runnable)? Как-то сложно получается. Целая матрешка из потоков/вызовов ради одного действия.

А как бы вы решили эту задачу? Нужно раз в минуту забирать данные из инета и обновлять их на экране в конкретном View. Какие классы бы вы использовали и кто кого бы там вызывал?

Кстати, если есть данные, которые нужны только моему приложению и которые нужно сохранить, чтобы они были доступны при следующем запуске приложения, что лучше использовать для хранения этих данных: sqlite, файлы, что-то еще?
...
Рейтинг: 0 / 0
27.12.2011, 13:53
    #37595247
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
Запустите его из UI-потока, а вот что написать в doInBackground-это уже другое дело, более того никто не говорить что AsyncTask должен тут же закрыться. Реализуйте срабатывание по таймеру в doInBackground и все будет так, как вы хотели. Советую глянуть доку по AsyncTask, там все замечательно написано.
...
Рейтинг: 0 / 0
28.12.2011, 15:41
    #37597335
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
решение влоб:

Код: 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.
private class GetChangesTask extends AsyncTask<Void, Collection<SomeData>, Void> {
     
      private static final long PAUSE  = 60000;
      private static final long CANCEL_CHECK_INTERVAL = 5000;

      protected Long doInBackground(Void... urls) {
           while (!isCancelled()) {
                Collection<SomeData> changedData = //получить данные
                publishProgress(changedData);
                makePause();
           }           
     }    

     protected void onProgressUpdate(Collection<SomeData>... changedData) {
         //этот метод выполняется в UI thread, здесь можно обновлять данные         
     }

     private void makePause() {
       //не возвращаемся из этого метода 1 минуту,
       //но каждые 5 сек. проверяем, не остановлен ли наш "работник"
       StopWatch sw = new StopWatch(); //commons.lang 
       sw.start();
       while (sw.getTime() < PAUSE && !isCancelled())
                try {
                    TimeUnit.MILLISECONDS.sleep(CANCEL_CHECK_INTERVAL);
                } catch (InterruptedException e) {
                    
                }
     }

     protected void onPostExecute(Void result) {
         
     }
 }



запускаем работника в onResume, останавливаем в onPause
...
Рейтинг: 0 / 0
28.12.2011, 16:08
    #37597395
vscmaster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android. Обновление Activity по таймеру
делай такие вещи в Локал Сервис.
Крути себе Тред по таймауту.
С помощью Бродкаста отсылай данные которые изменились.


sqlite не поможет если данные будут в виде Объектов. И в новой версии к объекту добавили новое поле.
простые типы данных можно.
...
Рейтинг: 0 / 0
Форумы / Android [игнор отключен] [закрыт для гостей] / Android. Обновление Activity по таймеру / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]