为了账号安全,请及时绑定邮箱和手机立即绑定

handler.postDelayed(myRunnable,1000);为什么会出现两次?

handler.postDelayed(myRunnable,1000);为什么会出现两次?

正在回答

5 回答

因为要循环调用发送消息

0 回复 有任何疑惑可以回复我~

@Override

public void run() {

index=0;

index++;

index = index % 5;

while(true){

imageView.setImageResource(imgint[index]);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

我简单的加了个循环 但是图片不显示,这是因为没在handler.postDelayed这里更新吗?或者说是没在线程里更新ui吗?

0 回复 有任何疑惑可以回复我~
#1

Forest_Deer

PS:for(;;)的效率比while(true)高: for可以防止编译器的warning while会提示warning from stackoverflow 以下为个人测试及理解: 我开启新的线程来实现你的while()循环,并伴有Toast测试。发现图片不但不显示,整个界面卡在Toast那里,似乎UI线程一直在沉睡。长时间后,会弹出该应用没响应的窗口。 望有人能够指点一番。
2015-08-24 回复 有任何疑惑可以回复我~
#2

Forest_Deer

若将while改为有限次数,则只显示第一张图片。初步猜测是新建的myThread.sleep(1000)没有执行完,所以无法进行下一次循环。
2015-08-24 回复 有任何疑惑可以回复我~

新人,我想问问,既然主线程里调用handler.postDelayed(myRunnable,1000), 这句的意思是不是 1秒后开启这个线程,既然线程开启,可不可以用 while循环 ,如果再用handler.postDelayed(myRunnable,1000),那他是不是总在循环的开启线程,那用while循环好点还是用无限开启线程好点?虽然这只是个例子

0 回复 有任何疑惑可以回复我~
#1

Forest_Deer

handler.postDelayed(myRunnable,1000);是指延迟1s发送myRunnable。 因为该方法是在UI线程的onCreate()中执行的。所以该handler是绑定的UI线程,而UI线程早已经开启。 此处并非无限开启线程,而是不断地在handler---MessageQueue---Looper--handler中处理消息,更新UI。
2015-08-24 回复 有任何疑惑可以回复我~

老师,我刚试了一下,的确那个时间参数的作用是延迟的作用,但是我在主线程把那个延迟的时间改成了5秒,结果运行后5秒后才能实现图片轮寻,这证明的确是延迟5秒后把Runnable对象加入到了MessageQueue中 然后在Runnable的run方法不停调用那个延迟操作 这样就看起来实现了定时功能,老师,我在主线程中handler.postDelayed(myRunnable,1000)这句代码后谢了一句Toast的方法,结果程序一运行,这个Toast就出来了,5秒后图片才能轮寻,这说明handler.postDelayed(myRunnable,1000)这个方法内部实现是怎么样的呢?是不是应当也是又开了一个线程,然后定时几秒后才把Runnable对象加入到MessageQueque中的啊 谢谢了 老师

0 回复 有任何疑惑可以回复我~
#1

Forest_Deer

handler.postDelayed(myRunnable,1000);执行到此处,会等1秒再发送myRunnable,与此同时会执行下一句Toast 该方法实现过程:延迟1s,发送myRunnable至MessageQueue后立即返回,等待消息处理时再回调myRunnable中的run(); 5秒才轮询:(1)发送延迟1s (2)在MessageQueue中要排队,适时才执行。 整个过程都在UI线程中执行,并没有开启新的非UI线程。
2015-08-24 回复 有任何疑惑可以回复我~
#2

JxLiew 回复 Forest_Deer

你好,请问 回调myRunnable中的run();这里不是在子线程里执行的吗
2015-09-22 回复 有任何疑惑可以回复我~

你可以删掉一个试试,看看会不会出问题

0 回复 有任何疑惑可以回复我~
#1

qbidp 提问者

办法不错,多谢!
2015-01-05 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android面试常客Handler详解
  • 参与学习       54881    人
  • 解答问题       183    个

学Android开发,必学Handler,也是Android面试常客

进入课程

handler.postDelayed(myRunnable,1000);为什么会出现两次?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信