精华内容
下载资源
问答
  • Android中的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:29
    postDelayed在主线程,可以修改ui

    postDelayed对象是在主线程调用的:可以直接改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);
        }
    };

    展开全文
  • 大部分同学在回答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的线程会睡眠三秒之后才去消息队列拿队列头的消息:

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    1.png

    此时,我们又post了一个一秒之后执行的Message,于是它会被插入到队列头,然后MessageQueue.next的线程会被唤醒。但是拿到队列头的消息发现时间还没有到,于是又会再睡眠一秒:

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    2.png

    等了一秒之后MessageQueue.next的线程自己苏醒拿出队列头的MessageC去分发,然后继续拿MessageA。但是发现时间又没有到,于是又会再睡眠两秒:

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    3.png

    这个时候如果我们插入了一个立马执行的消息呢?它也是会插入到队列头,然后唤醒MessageQueue.next的线程,去队列头取消息执行。执行完之后又会拿MessageA。但是发现时间又没有到,于是又会再睡眠两秒。

    作者:嘉伟咯

    链接:https://www.jianshu.com/p/66fa1a8396ad

    展开全文
  • 我正在制作一个应用程序,其中某些小部件即时创建,...但我有一个问题,我无法取消处理程序的postdelayed()函数中的代码。我正在使用下面的代码来实现它。_sliders_item[_sliders_counter].setOnTouchListener(new V...
  • Android-定期使用postDelayed()运行方法我在Android应用程序中遇到一种情况,我想启动应该每秒运行的网络活动(发送一些数据)。 我实现如下:在new Handler()中,我具有以下代码:tv = new TextView(this);tv....
  • Handler的postDelayed流程

    2020-06-20 18:38:49
    mhandler.postDelayed(runnable, 1000); Handler的postDelayed方法其实也是通过sendMessageDelayed方法实现的。 public final boolean postDelayed(Runnable r, long delayMillis) { return sendMessageDelayed...
  • 突然某天好友老瑞问我 “View的postdelayed方法,延迟时间如果设置10分钟或者更长的时间有什么问题吗?“ 。当时听到这个问题时候我只能联想到 Handle.postDelay ,与此同时让我回想起了之前的一些疑问? View的...
  • 本文实例讲述了Android开发使用Handler的PostDelayed方法实现图片轮播功能。分享给大家供大家参考,具体如下:第一步:创建MainActivity类public class BaseActivity extends ActionBarActivity {private List ...
  • 主要介绍了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的实现原理 问题描述 Handler.postDelayed()的原理是如何保证延时执行的? 扩展:这样实现的好处是什么? 题目分析 猜测一下 以我们对Handler的了解,内部使用了Looper对消息队列进行循环获取...
  • Handler的postDelayed原理

    2020-03-17 23:06:05
    Handler.postDelayed()是先delay一定的时间,然后再放入messageQueue中,还是先直接放入MessageQueue中,然后在里面wait delay的时间?为什么? 问题二 如果Message会阻塞MessageQueue的话,那么先postDelay10秒一个...
  • 转载自http://www.dss886.com/2016/08/17/01/阅读之前先问大家一个问题:Handler.postDelayed()是先delay一定的时间,然后再放入messageQueue中,还是先直接放入MessageQueue中,然后在里面wait delay的时间?...
  • Android延迟执行PostDelayed

    万次阅读 2016-03-24 00:06:25
    Android程序中,使用postDelayed()方法,表示,在一段时间之后,执行新的线程,即可以达到一段特定程序延迟执行的目的。 使用:   // 延迟15秒 new Handler().postDelayed(new Runnable() { public void run...
  • 我们经常用handler中的postDelayed方法进行延迟操作,像这样 new Handler().postDelayed(new Runnable() { @Override public void run() { //操作内容 } },100); 我们都知道Hand...
  • Android 开发中,经常用到延时处理某个任务,经常用到 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延时,分别使用Handler的postDelayed和Timer的schedule实现延时操作。 首先我们使用Handler的postDelayed实现延时操作。 new Handler().postDelayed(new Runnable() { @Override public void ...
  • 延迟执行PostDelayed

    千次阅读 2015-02-09 16:57:15
    Android程序中,使用postDelayed()方法,表示,在一段时间之后,执行新的线程,即可以达到一段特定程序延迟执行的目的。 使用:  // 延迟15秒  new Handle
  • Android 中的postDelayed的用法

    千次阅读 2017-06-20 20:12:56
    Android 中的postDelayed的用法   首先对postDelayed的介绍: 传参:postDelayed中需要传两个参数,一个是Runnable对象,一个是以毫秒为单位的时间 作用:postDelayed经常被用于延时任务,或者定时器。   接...
  • tileView.postDelayed(new Runnable() {<!-- --> <pre><code> public void run() { } }, 3000); </code></pre> <p>} Zoom is not working! mScaleGestureDetector.getScaleFactor() in ZoomPanLayout always 1 ...
  • 阅读之前先问大家一个问题:Handler.postDelayed()是先delay一定的时间,然后再放入messageQueue中,还是先直接放入MessageQueue中,然后在里面wait delay的时间?为什么?如果你不答不上来的话,那么此文值得你看看...
  • Handler.postDelayed(Runnable, Int) 时, Runnable.run中的代码不执行 分析 Handler 部分的代码: static class H extends Handler{ final static int MSG_REFRESH_TIME = 0; WeakRefe...
  • if (intent.action == Intent.ACTION_BOOT_COMPLETED) {//... handler.postDelayed({ LogUtils.sysout(Tag, "开机广播启动") }, (5 * 1000).toLong()) 跟Thread.sleep(5000) 区别在哪里?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,615
精华内容 646
关键字:

postdelayed