2

我正在尝试创建一个显示当前时间的 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);
        }
    };
}

有没有人有这个问题的解决方案?

4

2 回答 2

0

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

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

并将其添加到您的可运行定义中

handler.postDelayed(runnable, 1000);

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

于 2012-12-09T18:56:36.023 回答
0

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

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

如果您想按原样修复代码,只需修改变量“时间”的值;)

于 2012-12-09T19:21:32.107 回答