首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当你发布一个Runnable到一个Handler时,run()会在什么时候被调用?

当你发布一个Runnable到一个Handler时,run()方法会在消息队列中的消息被处理时被调用。具体来说,当你调用Handler的post方法将一个Runnable对象发布到Handler所在的线程的消息队列时,该Runnable对象会被封装成一个消息并被添加到消息队列中。当消息队列中的消息被处理时,Handler会从消息队列中取出消息,并调用消息中封装的Runnable对象的run()方法。这样就实现了在指定的线程中执行特定的任务。

在Android开发中,Handler通常用于实现线程间的通信和任务调度。通过将Runnable对象发布到Handler所在的线程,我们可以在指定的线程中执行耗时操作,同时避免在主线程中执行耗时操作导致的界面卡顿问题。此外,Handler还可以用于实现定时任务、延时任务等功能。

腾讯云提供的相关产品中,与Handler类似的功能可以通过消息队列服务(Tencent Cloud Message Queue,CMQ)来实现。CMQ是一种高可用、高可靠、高性能的消息队列服务,可以实现分布式系统之间的异步通信。通过使用CMQ,开发者可以将消息发布到队列中,并由消费者从队列中获取消息并进行处理,从而实现类似于Handler的消息传递和任务调度功能。

了解更多关于腾讯云消息队列服务的信息,请访问:https://cloud.tencent.com/product/cmq

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android中Handler引起的内存泄露

在Android中,所有Android框架的事件(比如Activity的生命周期方法调用和按钮点击等)都是放入消息中,然后加入Looper要处理的消息队列中,由Looper负责一条一条地进行处理。...2.当一个Handler在主线程进行了初始化之后,我们发送一个target为这个Handler的消息Looper处理的消息队列,实际上已经发送的消息已经包含了一个Handler实例的引用,只有这样Looper...在处理到这条消息才可以调用Handler#handleMessage(Message)完成消息的正确处理。...finish(); } } 分析一下上面的代码,当我们执行了Activity的finish方法,延迟的消息会在被处理之前存在于主线程消息队列中10分钟,而这个消息中又包含了Handler的引用,...当你需要在静态内部类中调用外部的Activity,我们可以使用弱引用来处理。另外关于同样也需要将Runnable设置为静态的成员属性。注意:一个静态的匿名内部类实例不会持有外部类的引用。

57020
  • AsyncTask源码分析

    先有一个问题,call()方法是在哪里会被调用呢?其实是在mFuture内部的run()方法中调用mWorker他的call方法。具体代码读者可以自行查找项目源码,这里就不多说了。...5、scheduleNext()方法取出队列中的第一个Runnable,加他添加到THREAD_POOL_EXECUTOR线程池中开始执行任务 6、Runnable调用FutureTask的run()方法执行...执行结果是如何传递主线程 我们知道doInBackground()函数是我们的任务具体执行函数。...这个函数是在WorkerRunnable的call()函数中被调用,从上面的执行过程介绍中我们知道call()方法是在FutureTask的run方法执行的时候调用的。...onProgressUpdate()是什么时候调用 在分析handleMessage()方法的时候我们留了一个小尾巴,MESSAGE_POST_PROGRESS这个标记消息在什么时候发出的?

    78320

    android学习笔记----Handler的使用、内存泄漏、源码分析等一系列问题

    一般情况,一个消息的target是发送这个消息的Handler,这么一来,Looper就会把消息交给Handler处理,这个时候Handler的dispatchMessage方法就会被调用,一般情况最终会调用...,每取出一条消息,就会尝试执msg.target.dispatchMessage(msg) 总结:用post发送消息Handler对象绑定了哪个Looper,那么post参数传入的Runnable对象就在...= null) { // 这个方法很简单,直接调用msg.callback.run();这个callback就是传进来的Runnable对象 // 比如handler.post...handler的post方法,那么会调用handleCallback方法,里面会执行message.callback.run();这个callback就是传入进来的Runnable对象,见源码,handler.post...一个消息在被 Looper 处理时或者移出队列时会被标识为 FLAG_IN_USE,然后会被加入回收的消息链表,这样我们调用 Message.obtain() 方法就可以从回收的消息池中获取一个旧的消息

    59510

    Android Handler机制4之Looper与Handler简介

    简单翻一下: Handler一个可以通过关联一个消息队列来发送和处理消息,发送或处理Runnable对象的一个处理程序,每个Handler都关联一个单个的线程和消息队列,当你创建一个新的Handler...的时候它就将绑定一个线程或线程上的消息队列,从那时起,这个Handler就将为这个消息队列提供消息或Runnable对象,处理消息队列释放出来的消息或Runnable对象。...翻译一下: 当你发送一个Handler,你可以使消息队列(MessageQueue)尽快去处理已经准备好的条目,或者指定一个延迟处理的时间或者指定时间处理,后两者允许你实现超时,Ticks(系统相对的时间单位...即当一个进程应用程序创建,它的主线程会运行一个消息队列负责管理它创建的高层应用程序对象(如Activity、Broadcast Receiver等)和任何它的窗口创建的对象,你可以通过一个Handler...的,我们看下这个方法在哪里调用 ?

    88230

    Java 线程池架构原理和源码解析(ThreadPoolExecutor)

    放入等待队列中了; maximumPoolSize:一般你用不到,当大于了这个值就会将Thread由一个丢弃处理机制来处理,但是当你发生:newFixedThreadPool的时候,corePoolSize...和maximumPoolSize是一样的,而corePoolSize是先执行的,所以他会先放入等待队列,而不会执行下面的丢弃处理中,看了后面的代码你就知道了。...通常你得到线程池后,会调用其中的:submit方法或execute方法去操作;其实你会发现,submit方法最终会调用execute方法来进行操作,只是他提供了一个Future来托管返回值的处理而已,当你调用需要有返回值的信息...execute方法,就会抛出上面说明的异常:RejectedExecutionException 再回头来看下【代码段4】中进入等待队列后的操作: if (runState !...Runnable,外部开始在代码段中发现了调用哪个这个Worker的start()方法,也就是线程的启动方法,其实也就是调用了Worker的run()方法,那么我们重点要关心run方法是如何处理的 源码段

    38531

    深入Netty事件流程分析(下)

    默认为初始化,表示handlerAdd/handlerRemove均没有调用 private static final int INIT = 0; // handlerAdded即将被调用(实际还没有调用...,准备就绪,可以调用),一般是在不需要保证有序的情况下 private static final int ADD_PENDING = 1; // handlerAdd已经调用 private static...addLast或者是addFirst的方式构建,为了保证handler方法执行的有序性,于是在构建上下文的时候多添加一个步骤,接下来我们可以看到普通的handler添加方式,会在addLast中也调用上述...那么channel是在什么时候销毁的呢,我们可以考虑一个已熟知的数据库连接connection创建与销毁,什么时候需要销毁connection,自然是调用close()方法的时候,这个时候connection...invokeLater(new Runnable() { @Override public void run() { if (outboundBuffer !

    78760

    Android :安卓学习笔记之 Handler机制 的简单理解和使用

    Handler机制 1、Handler使用的引出 有这样一个需求,当打开Activity界面,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,就类似于各个APP的欢迎闪屏页面...Handler需绑定 线程才能使用;绑定后,Handler的消息处理会在绑定的线程中执行 * b....// 上述结论会在讲解使用“post(Runnable r)”方式讲解 if (msg.callback !...(6.4.3) 6.4.3、在工作线程中 发送消息消息队列中 /** * 具体使用 * 需传入1个Runnable对象、复写run()从而指定UI操作 */ mHandler.post...看到这里,思路似乎终止了,我们跟随Handler、MessQueue的脚步,只看到了Message插入MessageQueue的私有队列中。那我们产生的Message什么时候会背消费呢?

    85410

    Handler 消息机制原来解析

    而不会在处理同步消息。因为屏障消息没有target,因此屏障消息不会被处理。当你使用了屏障消息后,在不使用的时候一定要手动移除该屏障消息。否则,屏障消息后面的同步消息永远不会被处理。...(); } 从实现代码可以看出: 如果消息是封装的runnable,则调用runnablerun方法。...HANDLER = new Handler(Looper.getMainLooper()); public static void run(@NonNull Runnable runnable...如果当前的消息没有执行时间,其后的也一定不会到,当前的系统时间小于msg.when,那么会计算一个timeout,在到执行时间wake up。...4.9、只能保证在when之前消息不被处理,不能够保证一定在when处理 在Loop.loop()中是顺序处理消息,如果前一个消息处理耗时较长,完成之后已经超过了when,消息不可能在when时间点处理

    94410

    Handler源码和9个常见问题的解答,这些你都掌握了吗?

    大意就是Handler允许你发送Message/Runnable线程的消息队列(MessageQueue)中,每个Handler实例和一个线程以及那个线程的消息队列相关联。...当你创建一个Handler应该和一个Looper进行绑定(主线程默认已经创建Looper了,子线程需要自己创建Looper),它向Looper的对应的消息队列传送Message/Runnable同时在那个...前面说过,当你创建一个Handler应该和一个Looper进行绑定(绑定也可以理解为创建,主线程默认已经创建Looper了,子线程需要自己创建Looper),因此我们先来看看主线程中是如何处理的: /...方法就不会被调用了;如果 Callback 处理了消息,但是并没有拦截,那么就意味着一个消息可以同时 Callback 以及 Handler 处理。...对象只是调用了它的run方法,根本并没有启动一个线程,源码如下: //Handler.java public final boolean post(@NonNull Runnable r) {

    1.3K00

    实现杂记(27):解决在onCreate()过程中获取View的width和Height为0的4种方法

    一般来说OnGlobalLayoutListener就是可以让我们获得到view的width和height的地方.下面onGlobalLayout内的代码会在View完成Layout过程后调用。...简单地说,只要用View.post()一个runnable就可以了。...runnable对象中的方法会在View的measure、layout等事件后触发,具体的参考Romain Guy: UI事件队列会按顺序处理事件。...在setContentView()调用后,事件队列中会包含一个要求重新layout的message,所以任何你post队列中的东西都会在Layout发生变化后执行。...2、语法很简单 3、重写View的onLayout方法 这个方法只在某些场景中实用,比如当你所要执行的东西应该作为他的内在逻辑内聚、模块化在view中,否者这个解决方案就显得十分冗长和笨重。

    1.5K20

    从使用到原理学习Java线程池

    submit最终调用的也是execute(Runnable runable),submit只是将Callable对象或Runnable封装成一个FutureTask对象,因为FutureTask是个Runnable...当线程获取cpu后,run()方法会被调用。不要自己去调用Thread的run()方法。之后根据CPU的调度在就绪——运行——阻塞间切换,直到run()方法结束或其他方式停止线程,进入dead状态。...Thread的start()方法调用时,运行的实际上是Worker的run()方法,接着runWorker()中,有个while循环,一直从getTask()里得到Runnable对象,顺序执行。...2.控制最大并发数 那Runnable什么时候放入workQueue?...Worker又是什么时候创建,Worker里的Thread的又是什么时候调用start()开启新线程来执行Worker的run()方法的呢?

    34221

    Android精通之Handler讲解

    封面图 一:简介 软件技术人员,时代作者,从 Android 全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family !...Handler的方法以及使用 1.Handler.sendMessage() 2.Handler.post() 二:在onCreate中为主线程/UI线程,做一些轻量级的事情 主线程: //创建一个Handler...runnable.run(); //定时任务 handler.postDelayed(runnable,5000...线程默认情况下没有与它们相关的消息循环;创建一个,在要运行循环的线程中调用prepare(),然后让loop()处理,直到循环停止。 与消息循环的大多数交互是通过Handler类。...强引用(StrongReference) 强引用可以理解为我们生活中必不可少的东西,如你的手机,当你空间不足(占用空间),你也不会丢弃它,宁可抛出异常,在Java中最为常见的对象,只要此引用存在并且没有释放就不会被垃圾回收机制回收

    45720

    深入探讨Android异步精髓Handler

    为什么明明把handler.post(Runnable runnable)放入子线程中了但是Runnablerun()却在主线程中执行呢?...其实,这个问题在之前的分析中已经提到了:调用handler.post(Runnable runnable),该runnable会被系统封装为Message的callback。...在该示例中handler是在主线程中创建的,所以它当然会在主线程中处理消息;如此以来该Runnable会在主线程中执行;所以,在Runnablerun()方法中执行耗时的操作是不可取的容易导致应用程序无响应...那么,调用view.post(Runnable runnable)会在子线程中执行还是主线程中执行呢?...那么,调用Activity.runOnUiThread(Runnable runnable)方法会在子线程中执行还是主线程中执行呢?

    57120

    【Android开发进阶系列】多线程专题

    Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布事件队列的UI线程。...每次你新创建一个Handle对象,它会绑定于创建它的线程(也就是UI线程)以及该线程的消息队列,从这时起,这个handler就会开始把Message或Runnable对象传递消息队列中,并在它们出队列的时候执行它们...Handler Thread原理图         Handler可以把一个Message对象或者Runnable对象压入消息队列中,进而在UI线程中获取Message或者执行Runnable...对象,Handler把压入消息队列有两类方式,Post和sendMessage:     Post方式:         Post允许把一个Runnable对象入队消息队列中。...,它会传递一个Runnable对象消息队列中,在这个Runnable对象中,重写run()方法。

    46730
    领券