我在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秒,等等。
表示计时器无法正常工作。
我使用了asynctask并使用计时器每秒调用它。
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;
问题是一样的。
请帮帮我。
我的要求是每秒都有更新列表项目。
谢谢。
这是我的适配器类textview更新代码。
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是
Vector vct;
我将值分配给适配器类构造函数中的vector。
答案 0 :(得分:0)
以下是与您的案例类似的示例。
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());
}
}
每当调用适配器的notifyDataSetChanged()方法时,设置lastUpdatedTime的方式与创建rightNow的方式相同。