有关Android中定时器的问题
如题,基本代码如下:importjava.util.Timer;importjava.util.TimerTask;privateTimermTimer;mTimer=n...
如题,基本代码如下:
import java.util.Timer;
import java.util.TimerTask;
private Timer mTimer;
mTimer = new Timer();
setTimerTask();
private void setTimerTask() {
mTimer.schedule(new TimerTask() {
@Override
public void run() {
Toast.makeText(edu201301.this, "ABCD", Toast.LENGTH_LONG).show();
//如果run中为空,不报错,只要有一条语句,不管是什么,肯定程序自动关闭退出
}
}, 1000, 1000);
}
问题://如果run中为空,不报错,只要有一条语句,不管是什么,肯定程序自动关闭退出 ,连个提示都没有,为什么呢?
应该怎么样才能正常运行定时器呢?
谢谢 展开
import java.util.Timer;
import java.util.TimerTask;
private Timer mTimer;
mTimer = new Timer();
setTimerTask();
private void setTimerTask() {
mTimer.schedule(new TimerTask() {
@Override
public void run() {
Toast.makeText(edu201301.this, "ABCD", Toast.LENGTH_LONG).show();
//如果run中为空,不报错,只要有一条语句,不管是什么,肯定程序自动关闭退出
}
}, 1000, 1000);
}
问题://如果run中为空,不报错,只要有一条语句,不管是什么,肯定程序自动关闭退出 ,连个提示都没有,为什么呢?
应该怎么样才能正常运行定时器呢?
谢谢 展开
2个回答
展开全部
你这里犯了一个基本的错误。
你的timer是没有问题的,问题在Toast.makeText(edu201301.this, "ABCD", Toast.LENGTH_LONG).show();中。
另外你说没有报错,我不太相信,logcat里面应该会有log出来的。除非你的logcat有问题。
另外把Toast.makeText(edu201301.this, "ABCD", Toast.LENGTH_LONG).show();
换成其他基本的语句应该是不会有问题的。
这里的问题主要出在你用timer开了一个新线程,然后你希望在新线程里面,直接在UI线程上显示东西。于是就有错了。
如果你只是为了测试timer,你可以把Toast.makeText(edu201301.this, "ABCD", Toast.LENGTH_LONG).show();
换成Log.e("Timer在运行", "ABCD");
这样你就会看到logcat里面,按照你设定的时间,不断的输出这句LOG。也就是Timer正常运行了。
如果你依旧希望能在UI线程上显示什么,那么你可以参考下线程间通信的handle、Message。或者简单利用AsyncTask等
你的timer是没有问题的,问题在Toast.makeText(edu201301.this, "ABCD", Toast.LENGTH_LONG).show();中。
另外你说没有报错,我不太相信,logcat里面应该会有log出来的。除非你的logcat有问题。
另外把Toast.makeText(edu201301.this, "ABCD", Toast.LENGTH_LONG).show();
换成其他基本的语句应该是不会有问题的。
这里的问题主要出在你用timer开了一个新线程,然后你希望在新线程里面,直接在UI线程上显示东西。于是就有错了。
如果你只是为了测试timer,你可以把Toast.makeText(edu201301.this, "ABCD", Toast.LENGTH_LONG).show();
换成Log.e("Timer在运行", "ABCD");
这样你就会看到logcat里面,按照你设定的时间,不断的输出这句LOG。也就是Timer正常运行了。
如果你依旧希望能在UI线程上显示什么,那么你可以参考下线程间通信的handle、Message。或者简单利用AsyncTask等
更多追问追答
追问
谢谢 ,但只要有一条语句,不管是什么,肯定程序自动关闭退出 。
其实我是想在一个 TextView中显示当前时间。
run里面语句: TextView1.setText("ABCD");
也不行
追答
估计你没有系统的学习教材里的东西吧。
TextView1.setText("ABCD");会出问题的原理和Toast.makeText(edu201301.this, "ABCD", Toast.LENGTH_LONG).show();
会出问题的原理一样。
因为你在一个线程中,想要更新另外一个线程的东西,当然会出错!
Timer启动了一个线程,你在Timer的线程里想要更新UI线程里的东西,这是不允许的。看logcat,有错误信息。
你的问题,本质上是如何在不同线程间通信的问题
还是那句话,如果你希望在Timer启动的线程里对UI线程上的东西进行更新,你得去找找用handle、Message(进行线程间传递消息的资料)。或者简单利用AsyncTask等的资料。
如另外那位同志所说的,在UI线程中创建handler,来接受message,用以更新UI界面上的东西。然后在Timer的线程里用UI创立的handler定时发送消息出来。
当然,方法多种多样,对于新人,AsyncTask可能用起来更简单一些。其他的,用广播之类的也可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询