【问题标题】:How to pause a Thread's Message Queue in Android?如何在 Android 中暂停线程的消息队列?
【发布时间】:2011-04-22 14:38:09
【问题描述】:

我正在通过 Handler.post() 将一堆 runnables 排队到一个线程中。我希望能够向应该暂停的线程发送注释。

我所说的暂停是指完成您当前正在处理的可运行消息或消息,但在我告诉您继续之前不要转到消息队列中的下一条消息或可运行消息。

【问题讨论】:

  • 为什么不停止发送消息,直到您准备好继续发送消息?暂停收件人似乎有点破坏消息队列的抽象。
  • 队列将用于从网络下载内容、写入文件等。如果用户位于应用程序中的某些位置,我希望能够暂停队列受益于在后台和网络连接中进行的操作更少。
  • 也许澄清一下,它不必像我那样工作。我试图找到一种简单的方法来在一个线程上排队一堆任务,并能够随时添加、暂停和停止该队列。这正是我想要的。
  • 我正在寻找相同的解决方案。也许如果我们使用全局静态布尔值,我们可以暂停 abd 播放我们的 Looper……你觉得呢??

标签: java android multithreading message-queue


【解决方案1】:

在 Java 中实现的 Thread 没有暂停方法,但您可以使用布尔值模拟暂停,等待最后一条消息完成是您可以在布尔值的 setter 方法中执行的操作,

public void run(){
    while(!paused && !finised){
        // work
    }
}

public void setPause(boolean paused){
   //wait for your last message if there is one and then
    this.paused = paused;
}

并且您应该使用其他布尔值来了解线程是否已完成,以退出 while。

【讨论】:

  • 感谢您的快速回复。线程是否需要 Looper 才能拥有队列?如果是这样,这对这张照片有何影响?
  • 为了澄清最后一个问题,你在哪里工作 // 那里发生了什么?如果线程只是用来处理消息队列中的可运行对象,则 // 工作空间中没有任何东西可以放入。发布到该线程的可运行对象在哪里运行?那个while语句真的会影响他们吗?
  • 只暂停线程,我认为是这样,而对于播放,你会调用 setPause(false);所以它会再次陷入困境,在 //work 你会取出下一条消息或调用你需要的可运行对象,把它想象成你队列的管理员......
  • 你能给出一些示例代码吗?我仍然不太确定在消息、处理程序等方面会是什么样子。再次感谢。
【解决方案2】:

如果其他人找到解决这个问题的方法,我最终选择了 ThreadPoolExecutor,使用文档中的示例代码来创建 PausableThreadPoolExecutor:http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

它不使用消息队列或 Looper,但它完成了我想做的事情,即创建一个可以暂停和/或取消的 Runnables 队列。它的额外好处是能够将队列分布在指定数量的线程上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2016-08-04
    • 1970-01-01
    • 2015-06-12
    • 2020-04-02
    • 2013-11-26
    相关资源
    最近更新 更多