android – 获取主线程的消息队列和处理程序

android – 获取主线程的消息队列和处理程序,第1张

概述如何从另一个线程获取主线程的消息队列? Looper.getMainLooper()获取主线程的looper但我无法找到另一种线程的looper获取MessageQueue的方法.而且,我如何获得主循环器的处理程序?我无法找到任何方法来获得它. @ r.v, 我有类似的需求.我想知道MessageQueue什么时候是空的,当我发布一些东西时,我想知道什么时候它变空了,什么都没做.我查看了Messa 如何从另一个线程获取主线程的消息队列? Looper.getMainLooper()获取主线程的looper但我无法找到另一种线程的looper获取MessageQueue的方法.而且,我如何获得主循环器的处理程序?我无法找到任何方法来获得它.解决方法 @ r.v,

我有类似的需求.我想知道MessageQueue什么时候是空的,当我发布一些东西时,我想知道什么时候它变空了,什么都没做.我查看了MessageQueue.IDleHandler,发现它没有像我想要的那样表现我提出了另一个解决方案.

在我的情况下,我想使用Looper / Handler机制来顺序执行文件下载.基本上我想要执行的每个下载都包含在Runnable中.我只希望一次运行一个,所以这种模式运行良好,而不必深入研究更复杂的线程解决方案的细节.另外,我想知道什么时候我第一次把东西放进队列并开始工作,并想知道什么时候完成(队列是空的).

我能够使用处理程序的消息机制来实现这一点.消息按Runnables顺序处理,因此您可以策略性地将消息放入队列中,以帮助您了解队列的状况.与Handler队列中的Runnables不同,对于最终提供解决方案的消息,存在一些查询和删除功能.

我所做的是每次向Handler添加一个runnable(通过Handler.post),我还会删除自定义QUEUE_EMPTY消息的所有实例,然后添加一个新的QUEUE_EMPTY消息.这可确保我在队列末尾有一条QUEUE_EMPTY消息.一旦我在我的子类处理程序中遇到QUEUE_EMPTY消息,我知道我在队列的末尾.另外,如果我在添加runnable时没有在队列中找到QUEUE_EMPTY消息,我知道队列是空的并且线程处于空闲状态.

正如一些人会很快指出的那样,这种解决方案存在一些真正的低效率.如果队列中有大量条目,则必须遍历队列以获取这些“标记”消息可能是一个真正的性能问题.就我而言,我一次只处理少量文件下载,因此任何性能损失都可以忽略不计.如果你有类似的情况,我认为这是一个非常合理的解决方案. Android SDK为MessageQueue提供这些基本功能本来不错.我同意理想的是你不想弄乱MessageQueue,但知道它何时处于空闲/工作/空状态似乎是合理的事情,而且我确信当有价值知道这些事情时会有很多场景.

class DownloaderThread extends Thread{    private static final int QUEUE_EMPTY = 9999;    private MyHandler handler;    @OverrIDe    public voID run()    {        try        {            Looper.prepare();            handler = new MyHandler();            Looper.loop();        }        catch (Throwable t)        {            Log.e(TAG,"halted due to an error",t);        }    }    public voID post(Runnable r)    {        if(!handler.hasMessages(QUEUE_EMPTY))        {            Log.v(TAG,"Download queue was empty.  First element being added.");        }        handler.post(r);        handler.removeMessages(QUEUE_EMPTY);        handler.sendEmptyMessage(QUEUE_EMPTY);    }    class MyHandler extends Handler    {        @OverrIDe        public voID handleMessage(Message msg)        {            if(msg.what == QUEUE_EMPTY)            {                Log.v(TAG,"Download runnable queue is empty!");            }        }    }};
总结

以上是内存溢出为你收集整理的android – 获取主线程的消息队列和处理程序全部内容,希望文章能够帮你解决android – 获取主线程的消息队列和处理程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1128370.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存