Android listview计时器每秒运行一次

时间:2014-03-18 11:42:11

标签: android listview timer android-asynctask

我在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。

1 个答案:

答案 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的方式相同。