有人能给出一个简单的例子,每秒钟更新一个文本框左右?
我想要制作一个飞行的球,并需要每秒计算/更新球的坐标,这就是为什么我需要某种计时器。
我从这里什么也得不到。
有人能给出一个简单的例子,每秒钟更新一个文本框左右?
我想要制作一个飞行的球,并需要每秒计算/更新球的坐标,这就是为什么我需要某种计时器。
我从这里什么也得不到。
当前回答
这很简单! 你创建了一个新的定时器。
Timer timer = new Timer();
然后扩展计时器任务
class UpdateBallTask extends TimerTask {
Ball myBall;
public void run() {
//calculate the new position of myBall
}
}
然后以一定的更新间隔将新任务添加到Timer中
final int FPS = 40;
TimerTask updateBall = new UpdateBallTask();
timer.scheduleAtFixedRate(updateBall, 0, 1000/FPS);
声明:这不是理想的解决方案。这是使用定时器类的解决方案(由OP要求)。在Android SDK中,建议使用Handler类(在接受的答案中有示例)。
其他回答
void method(boolean u,int max)
{
uu=u;
maxi=max;
if (uu==true)
{
CountDownTimer uy = new CountDownTimer(maxi, 1000)
{
public void onFinish()
{
text.setText("Finish");
}
@Override
public void onTick(long l) {
String currentTimeString=DateFormat.getTimeInstance().format(new Date());
text.setText(currentTimeString);
}
}.start();
}
else{text.setText("Stop ");
}
您希望UI更新发生在已经存在的UI线程中。
最好的方法是使用一个Handler,它使用postDelayed在延迟后运行一个Runnable(每次运行都安排下一次运行);使用removeCallbacks清除回调。
您已经找到了正确的地方,所以再看一遍,也许可以弄清楚为什么代码示例不是您想要的。(请参见从计时器更新UI的同一篇文章)。
他是更简单的解决方案,工作在我的应用程序。
public class MyActivity extends Acitivity {
TextView myTextView;
boolean someCondition=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
myTextView = (TextView) findViewById(R.id.refreshing_field);
//starting our task which update textview every 1000 ms
new RefreshTask().execute();
}
//class which updates our textview every second
class RefreshTask extends AsyncTask {
@Override
protected void onProgressUpdate(Object... values) {
super.onProgressUpdate(values);
String text = String.valueOf(System.currentTimeMillis());
myTextView.setText(text);
}
@Override
protected Object doInBackground(Object... params) {
while(someCondition) {
try {
//sleep for 1s in background...
Thread.sleep(1000);
//and update textview in ui thread
publishProgress();
} catch (InterruptedException e) {
e.printStackTrace();
};
return null;
}
}
}
因为这个问题仍然从谷歌搜索吸引了很多用户(关于Android定时器),我想插入我的两个硬币。
首先,Timer类在Java 9中将被弃用(请阅读已接受的答案)。
官方建议的方法是使用ScheduledThreadPoolExecutor,它更有效,功能丰富,可以额外安排命令在给定延迟后运行,或定期执行。此外,它还提供了ThreadPoolExecutor的额外灵活性和功能。
下面是一个使用普通功能的示例。
创建执行器服务: final ScheduledExecutorService SCHEDULER = executors . newscheduleledthreadpool (1); 只需安排你的runnable: 最后未来< ?> future = SCHEDULER。schedule(可运行任务,长延迟,TimeUnit单元); 你现在可以使用future来取消任务或检查任务是否完成,例如: future.isDone ();
希望你会发现这对在Android中创建任务有用。
完整的例子:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Future<?> sampleFutureTimer = scheduler.schedule(new Runnable(), 120, TimeUnit.SECONDS);
if (sampleFutureTimer.isDone()){
// Do something which will save world.
}
这很简单! 你创建了一个新的定时器。
Timer timer = new Timer();
然后扩展计时器任务
class UpdateBallTask extends TimerTask {
Ball myBall;
public void run() {
//calculate the new position of myBall
}
}
然后以一定的更新间隔将新任务添加到Timer中
final int FPS = 40;
TimerTask updateBall = new UpdateBallTask();
timer.scheduleAtFixedRate(updateBall, 0, 1000/FPS);
声明:这不是理想的解决方案。这是使用定时器类的解决方案(由OP要求)。在Android SDK中,建议使用Handler类(在接受的答案中有示例)。