Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.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 2.2:如何使用计时器自动更新文本视图?_Android_Timer_Textview - Fatal编程技术网

Android 2.2:如何使用计时器自动更新文本视图?

Android 2.2:如何使用计时器自动更新文本视图?,android,timer,textview,Android,Timer,Textview,我的应用程序中有一些文本视图,我希望每5秒自动更新一次。我有一个刷新它们的方法,但是如何制作一个每5秒运行一次该方法的计时器呢?谢谢 看看扩展a,它有一个onFinish()方法,您可以覆盖它来更新TextView,如果您想让它重复,请重新启动计时器。如果只想更新有限次,也可以绑定到onTick()。提供另一种解决方案 Handler h=new Handler(); @Override public void onCreate(Bundle savedInstanceState) {

我的应用程序中有一些文本视图,我希望每5秒自动更新一次。我有一个刷新它们的方法,但是如何制作一个每5秒运行一次该方法的计时器呢?谢谢

看看扩展a,它有一个onFinish()方法,您可以覆盖它来更新TextView,如果您想让它重复,请重新启动计时器。如果只想更新有限次,也可以绑定到onTick()。

提供另一种解决方案

Handler h=new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.setContentView(R.layout.main);
    h.post(new Runnable(){

        @Override
        public void run() {
            // call your function
            h.postDelayed(this,5000);

        }

    });

我自己也尝试过处理程序解决方案,尤其是在阅读了资源页上的这篇文章之后:。但我希望能够像秒表一样启动和停止计时器,在恢复计时器后,处理器解决方案开始不太定期地更新——大约每五秒钟在模拟器上更新一次。最后,我在一个博客上找到了一个建议解决方案的技巧,该解决方案使用了一个扩展AsyncTask的内部类。您可以在AsyncTask中使用publishProgress()-onProgressUpdate()功能。从onProgressUpdate(),您可以“直接”在UI线程中进行更改,例如myTextView.setText(…)。这将更频繁地发布结果。下面是该内部类的一个超级简单的实现:

private class UpdateTimerLabel extends AsyncTask<Integer, Integer, Integer> {

    @Override
    protected Integer doInBackground(Integer... arg0) {
        while (true) {
            try {
                Thread.sleep(1000);
                publishProgress(arg0);
                Log.d(tag, "AsyncTask tries to publish");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }if (1 == 0) break; // Silly but necessary I think

        }
        return null;
    }
    protected void onProgressUpdate(Integer... progress) {
        updateTimerTextView(); // Call to method in UI
    }
}
私有类UpdateTimeLabel扩展异步任务{
@凌驾
受保护的整数doInBackground(整数…arg0){
while(true){
试一试{
睡眠(1000);
出版进度(arg0);
d(标记“AsyncTask尝试发布”);
}捕捉(中断异常e){
e、 printStackTrace();
}如果(1==0)中断;//我认为这很愚蠢但很必要
}
返回null;
}
受保护的void onProgressUpdate(整数…进度){
updateTimerTextView();//在UI中调用方法
}
}

好吧,但既然我不想让它结束,我想一个普通的计时器会更好。有这样的代码示例吗?如果您不想让它结束,请设置一个非常高的开始值,并让它在onFinish中重新启动!小心。您需要从UI线程中更新这些。确保你的计时器触发的东西将在UI线程中运行,否则Android将强制关闭你。