Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
-
rezak90
- Сообщения: 3422
- Зарегистрирован: 26 июн 2012, 13:22
- Откуда: UA
-
Контактная информация:
Сообщение
rezak90 » 17 авг 2012, 13:57
в общем из TimerTask нужно обратится к адаптеру, а именно его обновить adapter.notifyDataSetChanged(), но так как TimerTask работает в отдельном потоке то соответственно приложение не даёт обратиться к адаптеру. В AsyncTask это легко реализуется через методы onPreExecute и onPostExecute так как они выполняются в главном потоке и всё ок, но в TimerTask таких методов нету. Как выйти из этой ситуации? Нужно допустим каждые 10 сек обновлять адаптер. Может кто подкинет инную идею?
Код: Выделить всё
private class MyTimerTask extends TimerTask {
private Context context;
public MyTimerTask(Context _context) {
context = _context;
}
@Override
public void run() {
//действия
adapter.notifyDataSetChanged(); //fail
}
}
R.id.team
Политика на форуме запрещена
-
neoksi
- Сообщения: 712
- Зарегистрирован: 26 июл 2012, 10:42
-
Контактная информация:
Сообщение
neoksi » 17 авг 2012, 14:23
Сталкивался с похожим при работе с AlarmManager'ом, выход там получился через BroadcastReceiver.
Общий смысл в том, что из отдельного потока бросаем месседж своему BroadcastReceiver, а он уже при отлове, вызывает необходимое действие в нашем активити.
-
rezak90
- Сообщения: 3422
- Зарегистрирован: 26 июн 2012, 13:22
- Откуда: UA
-
Контактная информация:
Сообщение
rezak90 » 17 авг 2012, 14:30
да тоже такая мысль была, но это уже напоминает китайский велосипед, но в любом случае пока других решений не вижу.
З.Ы. на заметку, китайский велосипед не самый плохой, хуже китайца есть ещё индусский велосипед
R.id.team
Политика на форуме запрещена
-
neoksi
- Сообщения: 712
- Зарегистрирован: 26 июл 2012, 10:42
-
Контактная информация:
Сообщение
neoksi » 17 авг 2012, 14:41
Можно попробовать через
synchronized, но я пока потоки не очень сильно в java изучил.....
Код: Выделить всё
private class MyTimerTask extends TimerTask {
private Context context;
public MyTimerTask(Context _context) {
context = _context;
}
@Override
public void run() {
//действия
synchronized (adapter) {
adapter.notifyDataSetChanged(); //fail
}
}
}
-
neoksi
- Сообщения: 712
- Зарегистрирован: 26 июл 2012, 10:42
-
Контактная информация:
Сообщение
neoksi » 18 авг 2012, 22:24
rezak90 писал(а):да тоже такая мысль была, но это уже напоминает китайский велосипед, но в любом случае пока других решений не вижу.
З.Ы. на заметку, китайский велосипед не самый плохой, хуже китайца есть ещё индусский велосипед
Так поделись, как именно сделал?
-
rezak90
- Сообщения: 3422
- Зарегистрирован: 26 июн 2012, 13:22
- Откуда: UA
-
Контактная информация:
Сообщение
rezak90 » 20 авг 2012, 11:05
в общем решил сначала пологировать в потоках и посмотреть что в каком потоке выполняется таким макаром:
оказалось следущее:
- как и говорил AsyncTask выполняется в отдельном потоке только метод doInBackground, остыльные его методы в выполняются в потоке main
- TimerTask выполняется в отдельном потоке
- блок synchronized выполняется в том же потоке что и TimerTask
Появилась идея и её проверил: не зависимо с какого потока вызвать AsyncTask, методы onPreExecute, onProgressUpdate и onPostExecute вызываются в главном потоке main. Так вот решил написать свой AsyncTask который вызывается в TimerTask и всё получилось.
R.id.team
Политика на форуме запрещена