我正在尝试创建一个显示当前时间的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);
}
};
}
有没有人能解决这个问题?
答案 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'的值;)