-
java postdelayed_Android中的postDelayed的用法
2021-02-28 07:36:30Android中的postDelayed的用法首先对postDelayed的介绍:传参:postDelayed中需要传两个参数,一个是Runnable对象,一个是以毫秒为单位的时间作用:postDelayed经常被用于延时任务,或者定时器。接下来讲下...Android中的postDelayed的用法
首先对postDelayed的介绍:
传参:postDelayed中需要传两个参数,一个是Runnable对象,一个是以毫秒为单位的时间
作用:postDelayed经常被用于延时任务,或者定时器。
接下来讲下postDelayed的用法:
1、创建一个Handler对象
2、创建一个Runnable对象
3、mHandler.postDelayed(runnable,1000);
注意点:如果需要清除使用以下方法
mHandler.removeCallbacks(runnable);//清除定时器
使用示例:
Handler handler=new Handler();
Runnable runnable=new Runnable(){
@Override
public void run() {
//这里写入要作的事情
handler.postDelayed(this, 2000);
}
};
handler.postDelayed(runnable, 2000);
ps:我的博客:http://blog.csdn.NET/shenshizhong
-
postDelayed作用
2018-03-26 14:18:19//表示两秒后执行此runnable方法 handler.postDelayed(runnable, 2000);//表示两秒后执行此runnable方法 handler.postDelayed(runnable, 2000);
-
postDelayed总结
2017-01-16 13:53:29postDelayed在主线程,可以修改uipostDelayed对象是在主线程调用的:可以直接改ui
所以:不能在postDelayed中获取网络数据,即使是在service中
private Handler m_Timer = new Handler();
private Runnable r = new Runnable() {
public void run() {
title_text.setText("自选"+(a++));
for(int i=0;i<m_Observer.size();++i) {
m_Observer.get(i).TimerUpdate(0);
}
m_Timer.postDelayed(r, 1000);
}
};
public void Stop(){
m_Timer.removeCallbacks(r);
}
public void Start(){
m_Timer.postDelayed(r, 1000);
}
postDelayed调用子线程:
private Runnable newThread =new Runnable() {
@Override
public void run() {
if (mainActivity.queue.size() > 0) {
String word = null;
if ((word = mainActivity.queue.poll()) != null) {
mainActivity.avicTts.speak(word);
}
}
}
};
private Runnable speakRun = new Runnable() {
public void run() {
new Thread(newThread).start();
mHandler.postDelayed(speakRun, 500);
}
}; -
java postdelayed_Handler.postDelayed的原理
2021-02-28 07:37:12大部分同学在回答Handler的原理的时候都能回答出Handler将消息丢到MessageQueue中,然后Looper.loop死循环不断从MessageQueue中拿消息去执行。...源码解析首先来看看handler里面是怎么处理postDelayed的...大部分同学在回答Handler的原理的时候都能回答出Handler将消息丢到MessageQueue中,然后Looper.loop死循环不断从MessageQueue中拿消息去执行。
这块我之前也有写个文章介绍,如果忘了可以去看看。
但是如果再继续追问Handler.postDelay又是怎么做到的就讲不出来了。这里就给大家讲一讲。
源码解析
首先来看看handler里面是怎么处理postDelayed的:public class Handler {
... public final boolean postDelayed(Runnable r, long delayMillis) { return sendMessageDelayed(getPostMessage(r), delayMillis);
}
... public final boolean sendMessageDelayed(Message msg, long delayMillis) {
... return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
... public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
... return enqueueMessage(queue, msg, uptimeMillis);
}
... private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
... return queue.enqueueMessage(msg, uptimeMillis);
}
...
}
可以发现最后它也是把Runnable封装成Message然后发给MessageQueue去处理的,所以我们继续看看MessageQueue.enqueueMessage方法:boolean enqueueMessage(Message msg, long when) {
...
synchronized (this) {
...
msg.markInUse();
msg.when = when;
Message p = mMessages;
boolean needWake; if (p == null || when == 0 || when
msg.next = p;
mMessages = msg;
needWake = mBlocked;
} else { // 按时间排序插入队列
needWake = mBlocked && p.target == null && msg.isAsynchronous();
Message prev; for (;;) {
prev = p;
p = p.next; if (p == null || when
} if (needWake && p.isAsynchronous()) {
needWake = false; //如果不是插入队列头的话不需要唤醒线程,让它继续等到拿队列头的消息的时候再重新计算睡眠时间
}
}
msg.next = p; // invariant: p == prev.next
prev.next = msg;
} if (needWake) { // 唤醒线程
nativeWake(mPtr);
}
} return true;
}
这个方法的作用其实很简单,按时间顺序把Message插入MessageQueue,形成一个按时间排序的单链表,然后唤醒线程。
然后看看唤醒了什么线程?
我们都知道MessageQueue中的消息是由Looper.loop里面的一个死循环去读取的。public static void loop() { final Looper me = myLooper(); if (me == null) { throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
} final MessageQueue queue = me.mQueue;
... for (;;) {
Message msg = queue.next(); // might block
...
}
...
}
这个这里还提示了MessageQueue.next方法也许会阻塞,所以我们看看next方法里面干了什么:Message next() {
... int nextPollTimeoutMillis = 0; for (;;) {
... //阻塞nextPollTimeoutMillis时间
nativePollOnce(ptr, nextPollTimeoutMillis); synchronized (this) { final long now = SystemClock.uptimeMillis();
Message prevMsg = null;
Message msg = mMessages; if (msg != null && msg.target == null) { // 跳过队列前面的无用Message
do {
prevMsg = msg;
msg = msg.next;
} while (msg != null && !msg.isAsynchronous());
} if (msg != null) { if (now
nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);
} else { //从队列头拿出Message
mBlocked = false; if (prevMsg != null) {
prevMsg.next = msg.next;
} else {
mMessages = msg.next;
}
msg.next = null;
msg.markInUse(); return msg;
}
}
...
}
...
}
}
这里面有个native方法nativePollOnce,阻塞线程一段固定的时间,当然MessageQueue.enqueueMessage里面的nativeWake方法也能直接唤醒它。
当有Message插入队列头的时候,就会唤醒线程。然后MessageQueue.next方法就会拿出队列头的Message计算是否需要再等待一段时间去执行。
举个例子
代码比较晕没有关系,我们用一个简单的例子把流程描述一下就好理解了。
首先假设队列里面有两个消息,分别在三秒、四秒之后执行,也就是说MessageQueue.next的线程会睡眠三秒之后才去消息队列拿队列头的消息:
1.png
此时,我们又post了一个一秒之后执行的Message,于是它会被插入到队列头,然后MessageQueue.next的线程会被唤醒。但是拿到队列头的消息发现时间还没有到,于是又会再睡眠一秒:
2.png
等了一秒之后MessageQueue.next的线程自己苏醒拿出队列头的MessageC去分发,然后继续拿MessageA。但是发现时间又没有到,于是又会再睡眠两秒:
3.png
这个时候如果我们插入了一个立马执行的消息呢?它也是会插入到队列头,然后唤醒MessageQueue.next的线程,去队列头取消息执行。执行完之后又会拿MessageA。但是发现时间又没有到,于是又会再睡眠两秒。
作者:嘉伟咯
链接:https://www.jianshu.com/p/66fa1a8396ad
-
java postdelayed_如何取消postDelayed()的执行
2021-02-26 11:55:56我正在制作一个应用程序,其中某些小部件即时创建,...但我有一个问题,我无法取消处理程序的postdelayed()函数中的代码。我正在使用下面的代码来实现它。_sliders_item[_sliders_counter].setOnTouchListener(new V... -
java postdelayed_Android-定期使用postDelayed()运行方法
2021-02-28 07:36:38Android-定期使用postDelayed()运行方法我在Android应用程序中遇到一种情况,我想启动应该每秒运行的网络活动(发送一些数据)。 我实现如下:在new Handler()中,我具有以下代码:tv = new TextView(this);tv.... -
Handler的postDelayed流程
2020-06-20 18:38:49mhandler.postDelayed(runnable, 1000); Handler的postDelayed方法其实也是通过sendMessageDelayed方法实现的。 public final boolean postDelayed(Runnable r, long delayMillis) { return sendMessageDelayed... -
View的postDelayed方法深度思考
2019-10-25 16:25:15突然某天好友老瑞问我 “View的postdelayed方法,延迟时间如果设置10分钟或者更长的时间有什么问题吗?“ 。当时听到这个问题时候我只能联想到 Handle.postDelay ,与此同时让我回想起了之前的一些疑问? View的... -
java postdelayed_Android开发使用Handler的PostDelayed方法实现图片轮播功能
2021-02-28 07:36:29本文实例讲述了Android开发使用Handler的PostDelayed方法实现图片轮播功能。分享给大家供大家参考,具体如下:第一步:创建MainActivity类public class BaseActivity extends ActionBarActivity {private List ... -
Android开发使用Handler的PostDelayed方法实现图片轮播功能
2020-08-28 13:00:03主要介绍了Android开发使用Handler的PostDelayed方法实现图片轮播功能,结合实例形式分析了Android基于Handler的PostDelayed方法实现图片轮播功能的具体步骤与相关操作技巧,需要的朋友可以参考下 -
Android - 延迟执行PostDelayed
2015-01-22 07:41:26延迟执行PostDelayed本文地址:http://blog.csdn.net/caroline_wendyAndroid程序中,使用postDelayed()方法,表示,在一段时间之后,执行新的线程,即可以达到一段特定... new Handler().postDelayed(new Runnable() { -
延时操作postDelayed
2016-11-13 22:24:43这是一种可以创建多线程消息的函数。这里用一个页面跳转的例子说明: ... handler.postDelayed(new Runnable() { @Override public void run() { Intent intent=new Intent(SpiashActivity. -
Handler postDelayed的实现原理
2020-02-26 11:31:04Handler postDelayed的实现原理 问题描述 Handler.postDelayed()的原理是如何保证延时执行的? 扩展:这样实现的好处是什么? 题目分析 猜测一下 以我们对Handler的了解,内部使用了Looper对消息队列进行循环获取... -
Handler的postDelayed原理
2020-03-17 23:06:05Handler.postDelayed()是先delay一定的时间,然后再放入messageQueue中,还是先直接放入MessageQueue中,然后在里面wait delay的时间?为什么? 问题二 如果Message会阻塞MessageQueue的话,那么先postDelay10秒一个... -
java postdelayed_你真的懂Handler.postDelayed()的原理吗?
2021-02-26 11:55:13转载自http://www.dss886.com/2016/08/17/01/阅读之前先问大家一个问题:Handler.postDelayed()是先delay一定的时间,然后再放入messageQueue中,还是先直接放入MessageQueue中,然后在里面wait delay的时间?... -
Android延迟执行PostDelayed
2016-03-24 00:06:25Android程序中,使用postDelayed()方法,表示,在一段时间之后,执行新的线程,即可以达到一段特定程序延迟执行的目的。 使用: // 延迟15秒 new Handler().postDelayed(new Runnable() { public void run... -
Android Handler postDelayed的原理
2019-11-21 21:34:43我们经常用handler中的postDelayed方法进行延迟操作,像这样 new Handler().postDelayed(new Runnable() { @Override public void run() { //操作内容 } },100); 我们都知道Hand... -
Android Handler.postDelayed 见解
2018-11-02 16:22:52Android 开发中,经常用到延时处理某个任务,经常用到 Handler.postDelayed, 一秒后执行一段代码: new Handler().postDelayed(new Runnable() { @Override public void run() { //do something ... -
Handler.postDelayed()无效
2020-04-07 15:59:39在项目使用 Handler.postDelayed() 延时执行任务,却发现无效,代码如下: private Handler mHandler = new Handler(); boolean ret = mHandler.postDelayed(new Runnable() { @Override public void run() { ... -
handler.postDelayed 不生效
2019-08-08 17:11:14在项目使用Handler.postDelayed()延时执行任务,却发现无效,代码如下: 修改后的代码如下: 总结:需要给Handler设置一个主线程的looper。 -
Android延时(postDelayed和schedule)
2020-02-13 18:15:58今天我们初识Android延时,分别使用Handler的postDelayed和Timer的schedule实现延时操作。 首先我们使用Handler的postDelayed实现延时操作。 new Handler().postDelayed(new Runnable() { @Override public void ... -
延迟执行PostDelayed
2015-02-09 16:57:15Android程序中,使用postDelayed()方法,表示,在一段时间之后,执行新的线程,即可以达到一段特定程序延迟执行的目的。 使用: // 延迟15秒 new Handle -
Android 中的postDelayed的用法
2017-06-20 20:12:56Android 中的postDelayed的用法 首先对postDelayed的介绍: 传参:postDelayed中需要传两个参数,一个是Runnable对象,一个是以毫秒为单位的时间 作用:postDelayed经常被用于延时任务,或者定时器。 接... -
Zoom not working after postDelayed()
2020-11-28 11:11:22tileView.postDelayed(new Runnable() {<!-- --> <pre><code> public void run() { } }, 3000); </code></pre> <p>} Zoom is not working! mScaleGestureDetector.getScaleFactor() in ZoomPanLayout always 1 ... -
Handler.postDelayed()的原理
2019-08-09 17:50:35阅读之前先问大家一个问题:Handler.postDelayed()是先delay一定的时间,然后再放入messageQueue中,还是先直接放入MessageQueue中,然后在里面wait delay的时间?为什么?如果你不答不上来的话,那么此文值得你看看... -
Android Handler.postDelayed 挖坑记
2020-07-27 17:07:02Handler.postDelayed(Runnable, Int) 时, Runnable.run中的代码不执行 分析 Handler 部分的代码: static class H extends Handler{ final static int MSG_REFRESH_TIME = 0; WeakRefe... -
handler.postDelayed跟Thread.sleep有什么区别
2020-05-28 10:28:59if (intent.action == Intent.ACTION_BOOT_COMPLETED) {//... handler.postDelayed({ LogUtils.sysout(Tag, "开机广播启动") }, (5 * 1000).toLong()) 跟Thread.sleep(5000) 区别在哪里?