Страница 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
да тоже такая мысль была, но это уже напоминает китайский велосипед, но в любом случае пока других решений не вижу.
З.Ы. на заметку, китайский велосипед не самый плохой, хуже китайца есть ещё индусский велосипед :D

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

Re: TimerTask

Добавлено: 20 авг 2012, 11:05
rezak90
в общем решил сначала пологировать в потоках и посмотреть что в каком потоке выполняется таким макаром:

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

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