1

Я пытаюсь редактировать ListView на регулярные промежутки времени с помощью TimerTask:Содержимое адаптера изменилось, но ListView не получил уведомление: проблема с перекрестной резьбой?

public static TimerTask mTtRefreshUpload = new TimerTask() { 
      @Override 
      public void run() { 
        ((Activity) context).runOnUiThread(new Runnable() { 
         @Override 
          public void run() { 
           // Should create new adapter in here, not in Background Thread 
           refreshStatusItemAdapter = new RefreshStatusItemAdapter(context, R.layout.simple_list_item_upload, Constants.mLlItems); 
          } 
         }); 
      } 
}; 

Но я получаю эту ошибку:

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes.

Я смотрел в documentation for TimerTask, но это не помогло.

В чем проблема? Это связано с проблемами поперечной резьбы?

+0

Да, метод запуска задачи таймера работает на фоновом потоке, поэтому вам нужно использовать механизм, такой как runOnUiThread, чтобы вытолкнуть любую работу UI, запускаемую оттуда обратно в поток пользовательского интерфейса. –

+0

Чего вы хотите достичь? Я угадываю, посмотрев на ваш фрагмент кода 'refreshStatusItemAdapter' уже был инициализирован и добавлен в' ListView' .. это правильно? – Rupesh

+0

@Chris @Karthik: просмотр списка уже устанавливает адаптер и показывает данные успешно. Но даже я инициализировал адаптер или вызывал «notifyDataSetChanged» адаптера в runOnUIThread или Handler, как указано выше. Я все еще получаю ошибку, как указано выше. Иногда я получаю эту ошибку, не всегда. –

ответ

0

меня такая же проблема, как вы,

Я думаю, что если вы использовали runOnUIThread, он по-прежнему всегда работает для вас.

Необходимо указать runOnUIThread в вашем Constructor, onPreExecute, onPostExecute.

Специально ваш ListView, также должен быть указан в runOnUIThread.

p/s: Последний раз, я забыл определить Initializing List View в runOnUiThread.

Смежные вопросы