Страница 1 из 1
TimerTask
Добавлено: 17 авг 2012, 13:57
rezak90
в общем из 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
}
}
Re: TimerTask
Добавлено: 17 авг 2012, 14:23
neoksi
Сталкивался с похожим при работе с AlarmManager'ом, выход там получился через BroadcastReceiver.
Общий смысл в том, что из отдельного потока бросаем месседж своему BroadcastReceiver, а он уже при отлове, вызывает необходимое действие в нашем активити.
Re: TimerTask
Добавлено: 17 авг 2012, 14:30
rezak90
да тоже такая мысль была, но это уже напоминает китайский велосипед, но в любом случае пока других решений не вижу.
З.Ы. на заметку, китайский велосипед не самый плохой, хуже китайца есть ещё индусский велосипед

Re: TimerTask
Добавлено: 17 авг 2012, 14:41
neoksi
Можно попробовать через
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
}
}
}
Re: TimerTask
Добавлено: 18 авг 2012, 22:24
neoksi
rezak90 писал(а):да тоже такая мысль была, но это уже напоминает китайский велосипед, но в любом случае пока других решений не вижу.
З.Ы. на заметку, китайский велосипед не самый плохой, хуже китайца есть ещё индусский велосипед

Так поделись, как именно сделал?
Re: TimerTask
Добавлено: 20 авг 2012, 11:05
rezak90
в общем решил сначала пологировать в потоках и посмотреть что в каком потоке выполняется таким макаром:
оказалось следущее:
- как и говорил AsyncTask выполняется в отдельном потоке только метод doInBackground, остыльные его методы в выполняются в потоке main
- TimerTask выполняется в отдельном потоке
- блок synchronized выполняется в том же потоке что и TimerTask
Появилась идея и её проверил: не зависимо с какого потока вызвать AsyncTask, методы onPreExecute, onProgressUpdate и onPostExecute вызываются в главном потоке main. Так вот решил написать свой AsyncTask который вызывается в TimerTask и всё получилось.