gpt4 book ai didi

Android ListView 计时器每秒运行一次

转载 作者:太空宇宙 更新时间:2023-11-03 11:12:35 24 4
gpt4 key购买 nike

我在 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 ,用户可以返回到此 Activity

所以我在 Onresume 中使用了

timerHandler.postDelayed(timerRunnable, 500);

和暂停

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

矢量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());
}
}

无论何时调用适配器的 notifyDataSetChanged() 方法,您设置 lastUpdatedTime 的方式与创建 rightNow 的方式相同。

关于Android ListView 计时器每秒运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22478326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com