Intereting Posts
Загрузить изображение Picasa для загрузки из галереи Отключить прокрутку между вкладками в FragmentActivity Arraylist arraylist в методе Панель инструментов не прокручивается даже после предоставления флага «app: layout_scrollFlags» При сравнении двух равных целых чисел в цикле while оператор с равным оператором терпит неудачу? Где находится платежный пакет Google Play? Не удалось открыть выбранный порт отладки VM (8700) Предотвращение петли синхронизации сети при синхронизации из сети в Android ContentProvider Отправка электронной почты с вложением в андроид программно Как издеваться над buildConfigField Gradle для сборки CSR Travis? Класс Mock для приложений Android с использованием Robolectric в приложении с кинжалом 2 Изменить цвет курсора edittext AppBarLayout.setExpanded (логическая, истинная) странная анимация в библиотеке поддержки 23.1.1 Увеличение емкости памяти эмулятора Android? Активность не может быть возобновлена

Таймер просмотра списка Android запускается каждую секунду

У меня проблема с использованием таймера в listview . В элементе списка я показал использование значений sqlite. Существует textview представление, показывающее разницу во времени последнего обновленного времени данных и текущего времени. Я должен показать это каждую секунду. Поэтому пользователь может знать, как долго он обновил запись.

Я попробовал это несколькими способами.

Первый путь

Я попытался добавить таймер в класс adapter . Поэтому для каждого элемента создается новый таймер. Поэтому приложение разбилось из-за того, что многие таймеры выполнялись одновременно.

Второй путь

Я пробовал использовать способ adapter.notifyDataSetChanged (). Вроде как это.

 Handler timerHandler = new Handler(); Runnable timerRunnable = new Runnable() { @Override public void run() { if (adapterChatThread != null) { adapter.notifyDataSetChanged(); } timerHandler.postDelayed(this, 1000); // run every second } }; timerRunnable.run(); 

Я перехожу к другому действию, когда нажимаю на элемент списка, и пользователь может вернуться к этой Activity .

Поэтому в Onresume я использовал

 timerHandler.postDelayed(timerRunnable, 500); 

И OnPause

 timerHandler.removeCallbacks(timerRunnable); 

Проблема – данные не показывают хорошо. Я имею в виду, что в каждой второй разнице данных не одна секунда. Некоторое время отличается 2сек, 5 сек, .. и т. Д.

Означает, что таймер не работает, как я ожидал.

Третий путь

Я использовал aynctask и вызываю его каждую секунду, используя таймер.

 class ThreadTimer extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { return null; } @Override protected void onPostExecute(Void result) { if (adapter != null) adapter.notifyDataSetChanged(); super.onPostExecute(result); } } 

Я назвал это, как здесь

 Handler timerHandler = new Handler(); Runnable timerRunnable = new Runnable() { @Override public void run() { new ThreadTimer().execute(); timerHandler.postDelayed(this, 1000); // run every second } }; timerRunnable.run(); 

Предыдущий выпуск. (Данные не показывают хорошо)

Четвертый путь

Использование AsyncTask в этом

 class ThreadTimer extends AsyncTask<Void, Void, Void> { void Sleep(int ms) { try { Thread.sleep(ms); } catch (Exception e) { } } @Override protected Void doInBackground(Void... params) { while (threadRun) { Sleep(1000); return null; } return null; } @Override protected void onPostExecute(Void result) { adapter.notifyDataSetChanged(); super.onPostExecute(result); } } 

Я назвал этот класс в OnResume. В режиме паузы я устанавливаю threadRun = false;

Выпуск такой же.

пожалуйста помогите.

Мое требование – обновлять элемент списка каждую секунду.

Спасибо.

редактировать

Вот мой код обновления текстового кода класса адаптера.

 Date lastUpdatedTime; final ChatThreadDAO ctd = new ChatThreadDAO(); long timeForNextResponse = ctd.getLastRespondedTime(vct.get(position).getThread_id()); try { if (vct.get(position).getThread_read_status() == 1 && timeForNextResponse > 0) { final long respTime = timeForNextResponse; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); lastUpdatedTime = formatter.parse(vct.get(position).getLast_updated_time()); final long timeDiff = (new Date()).getTime() - lastUpdatedTime.getTime(); if (timeDiff <= respTime) { timeForNextResponse = respTime - timeDiff; ctd.updateTimeRespondToLastMsg(vct.get(position).getThread_id(), timeForNextResponse); holder.tvChatTimer.setVisibility(View.VISIBLE); holder.tvChatTimer.setText(timeForNextResponse / 1000 + ""); } else { ctd.updateTimeRespondToLastMsg(vct.get(position).getThread_id(), 0); } } else { holder.tvChatTimer.setVisibility(View.INVISIBLE); } } catch (ParseException e) { e.printStackTrace(); } 

Здесь vct

Вектор vct;

Я присваиваю значения вектору в конструкторе класса адаптера.

Вот пример, похожий на ваш случай.

 private class connectionControl extends Thread { boolean stop_ = false; public void stop_() { this.stop_ = true; } public void run() { System.out.println("Thread started:" + getClass().getSimpleName()); while(!this.stop_) { try { Thread.sleep(1000); runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub Calendar c = Calendar.getInstance(); int rightNow = c.get(Calendar.SECOND) + c.get(Calendar.MINUTE)*60; if(rightNow - lastUpdatedTime > 10) { wirelessIcon.setImageResource(R.drawable.wirelessred); } else if(rightNow - lastUpdatedTime > 5) { wirelessIcon.setImageResource(R.drawable.wirelessyellow); } else { wirelessIcon.setImageResource(R.drawable.wirelessgreen); } } }); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("Thread stoped:" + getClass().getSimpleName()); } } 

Вы устанавливаете свой lastUpdatedTime так же, как вы создали rightNow, когда вы вызываете метод notifyDataSetChanged () вашего адаптера.