TimerTask

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

TimerTask

Сообщение 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
Контактная информация:

Re: TimerTask

Сообщение neoksi » 17 авг 2012, 14:23

Сталкивался с похожим при работе с AlarmManager'ом, выход там получился через BroadcastReceiver.

Общий смысл в том, что из отдельного потока бросаем месседж своему BroadcastReceiver, а он уже при отлове, вызывает необходимое действие в нашем активити.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: TimerTask

Сообщение rezak90 » 17 авг 2012, 14:30

да тоже такая мысль была, но это уже напоминает китайский велосипед, но в любом случае пока других решений не вижу.
З.Ы. на заметку, китайский велосипед не самый плохой, хуже китайца есть ещё индусский велосипед :D
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: TimerTask

Сообщение 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
Контактная информация:

Re: TimerTask

Сообщение neoksi » 18 авг 2012, 22:24

rezak90 писал(а):да тоже такая мысль была, но это уже напоминает китайский велосипед, но в любом случае пока других решений не вижу.
З.Ы. на заметку, китайский велосипед не самый плохой, хуже китайца есть ещё индусский велосипед :D
Так поделись, как именно сделал?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: TimerTask

Сообщение rezak90 » 20 авг 2012, 11:05

в общем решил сначала пологировать в потоках и посмотреть что в каком потоке выполняется таким макаром:

Код: Выделить всё

Thread.currentThread().getName()
оказалось следущее:
  • как и говорил AsyncTask выполняется в отдельном потоке только метод doInBackground, остыльные его методы в выполняются в потоке main
  • TimerTask выполняется в отдельном потоке
  • блок synchronized выполняется в том же потоке что и TimerTask
Появилась идея и её проверил: не зависимо с какого потока вызвать AsyncTask, методы onPreExecute, onProgressUpdate и onPostExecute вызываются в главном потоке main. Так вот решил написать свой AsyncTask который вызывается в TimerTask и всё получилось.
R.id.team
Политика на форуме запрещена

Ответить