无法在我的Android应用中使用Timer更新textView

时间:2012-12-09 18:49:05

标签: user-interface timer textview

我正在尝试创建一个显示当前时间的Android应用程序。我想用Timer更新Activity的时间,但TextView没有更新,所以屏幕上总是只有一次。这是我的代码:

package com.example.androidtemp;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.example.androidtemp.R;

public class ActivityTime extends Activity
{
    SimpleDateFormat sdf;
    String time;
    TextView tvTime;
    String TAG = "States";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_time);

        sdf = new SimpleDateFormat("HH:mm:ss");
        time = sdf.format(new Date(System.currentTimeMillis()));

        tvTime = (TextView) findViewById(R.id.tvTime);

        Timer timer = new Timer();
        TimerTask task = new TimerTask()
        {
            @Override
            public void run()
            {
                // TODO Auto-generated method stub
                timerMethod();
            }
        };

        try
        {
            timer.schedule(task, 0, 1000);
        } 
        catch (IllegalStateException e)
        {
            // TODO: handle exception
            e.printStackTrace();
            Log.e(TAG, "The Timer has been canceled, or if the task has been scheduled or canceled.");
        }
    }

    protected void timerMethod()
    {
        // TODO Auto-generated method stub
        this.runOnUiThread(changeTime);
    }

    private  final Runnable changeTime = new Runnable()
    {
        public void run()
        {
            // TODO Auto-generated method stub
            //Log.d(TAG, "Changing time.");
            sdf.format(new Date(System.currentTimeMillis()));
            tvTime.setText(time);
        }
    };
}

有没有人能解决这个问题?

2 个答案:

答案 0 :(得分:0)

使用处理程序,因为它可以访问应用程序的视图。您的应用程序的视图已经属于主线程,因此创建另一个访问它们的线程通常不起作用。如果没有错,处理程序使用消息与主线程及其组件进行通信。在您拥有线程定义的地方使用它:

Handler  handler = new Handler();
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, 1000);

并将其添加到您的runnable定义

handler.postDelayed(runnable, 1000);

当添加新的on时,最后一个语句将删除任何等待执行的runnable实例。有点像清理队列。

答案 1 :(得分:0)

如果您只想显示时间,我建议您使用DigitalClock或TextClock(您可以在布局xml和layout / layout-v17中使用'include'来使用不同的组件,具体取决于操作系统版本)。 / p>

如果您想要更多控制,我建议您使用Handler或ExecutorService而不是Timer。 Java Timer vs ExecutorService?

如果您想修改代码,只需修改变量'time'的值;)