Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android listview计时器每秒运行一次_Android_Listview_Timer_Android Asynctask - Fatal编程技术网

Android listview计时器每秒运行一次

Android listview计时器每秒运行一次,android,listview,timer,android-asynctask,Android,Listview,Timer,Android Asynctask,我在列表视图上使用计时器时遇到问题。 在我使用sqlite值显示的列表项中。有一个文本视图,显示数据上次更新时间与当前时间的时差。我必须在每一秒都展示它。这样用户就可以知道他更新记录的时间 我试过几种方法 第一条路 我试图在适配器类中添加计时器。因此,为每个项目创建新的计时器。所以应用程序崩溃了,因为许多计时器同时运行 第二条路 我尝试使用adapter.notifyDataSetChanged()方法。像这样 Handler timerHandler = new Handler(); Runn

我在
列表视图上使用计时器时遇到问题。
在我使用sqlite值显示的列表项中。有一个
文本视图
,显示数据上次更新时间与当前时间的时差。我必须在每一秒都展示它。这样用户就可以知道他更新记录的时间

我试过几种方法

第一条路 我试图在
适配器
类中添加计时器。因此,为每个项目创建新的计时器。所以应用程序崩溃了,因为许多计时器同时运行

第二条路 我尝试使用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();
当单击列表项时,我移动到另一个活动,用户可以返回此
活动

所以在我的简历中

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);
    }
    }
上一期已触发。(数据显示不好)

第四条路 使用
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);
    }
}
class ThreadTimer扩展异步任务{
无效睡眠(整数毫秒){
试一试{
睡眠(ms);
}捕获(例外e){
}
}
@凌驾
受保护的Void doInBackground(Void…参数){
while(threadRun){
睡眠(1000);
返回null;
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
adapter.notifyDataSetChanged();
super.onPostExecute(结果);
}
}
我在简历上给这个班打了电话。 在暂停时,我将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();
}
日期上次更新时间;
最终ChatThreadDAO ctd=新ChatThreadDAO();
long-timeForNextResponse=ctd.getLastRespondeTime(vct.get(position.getThread_id());
试一试{
if(vct.get(position).getThread_read_status()==1&&TimeFinder外部响应>0){
最终长响应时间=timeForNextResponse;
SimpleDataFormat格式化程序=新的SimpleDataFormat(“yyyy-MM-dd HH:MM:ss”);
LastUpdateTime=formatter.parse(vct.get(position.getLast_updated_time());
final long-timeDiff=(新日期()).getTime()-LastUpdateTime.getTime();

如果(timeDiff,这里有一个与您的案例类似的示例

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(),您都可以按照现在创建的方式设置LastUpdateTime方法。我建议您使用处理程序刷新列表视图,因为处理程序正在处理您的UI线程。我将此代码放在何处。请参阅我的编辑文章。我添加了适配器类代码。谢谢。这是一个线程类,用于检查您的更新时间。run()中的if条件是您检查所用时间的对象。您可以更改代码块。您可以将其放在单独的文件中,也可以将其作为活动的内部类、片段或您正在使用的任何内容。您可以在启动活动时创建一个对象,并在刷新列表的任何位置更改上次更新的时间。编辑:刚刚意识到我将其用作内部类类,因为LastUpdateTime是我的超类的一个变量。如果将其放在一个单独的文件中,则需要为LastUpdateTime准备一个getter setter方法。等等,是否正在更改适配器中的数据?LastUpdateTime必须设置在适配器外部,适配器用于处理每一行,因此即使它可以工作,您仍然可以设置y每次您创建或修改列表视图的行时,我们都会设置LastUpdateTime。每当您更改向量的内容或通知适配器刷新时,都必须设置LastUpdateTime。真是太感谢您了。我删除了适配器类中的update the LastUpdateTime,它现在可以正常工作了。非常感谢。当我无法滚动它时,它可以正常工作。但是当滚动时列表中显示了不正确的值。是否有其他方法来实现此功能?我无法用您当前的代码判断,但请记住,您的行是在GetView()上创建/修改的方法。因此,您需要在此处进行一些修改,否则数组中的数据可能不正确。您可以检查数组是否包含正确的值。默认自定义适配器在您每次根据数组滚动时都会创建一行,但大多数情况下您会对其进行修改,以使其重新使用自身。但无论如何,都会调用get视图。
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());
        }
    }