【问题标题】:Android: Thread infinite loop / phone overheatingAndroid:线程无限循环/手机过热
【发布时间】:2014-08-19 15:10:53
【问题描述】:

我正在处理一个处理所有服务器连接的线程:

public void run() {
    //this initializes Socket and PrintWriter/DataInputStream
    connect(server, port); 

    while(true) {
         //queue is a BlockingQueue where I put the messages to send
         while(!queue.isEmpty()) s
            //COMMUNICATE-WITH-SERVER-CODE
           }
    }   
}

代码有效,但一分钟左右后,我的手机开始过热,电池电量迅速下降。我知道这是因为无限循环。

我该如何解决?我想要一个Thread,它一旦启动,就会保持与服务器的连接(这样DataInputStreamPrintWriter 就不会每次都被初始化)。而且我希望线程能够响应:当我单击 Button 时,它应该立即向服务器发送一条消息进行处理。

我已经实现了一个Handler 用于与Thread->Activity 通信。但是Activity->Thread怎么沟通呢?

欢迎任何提示。

【问题讨论】:

  • Thread.sleep(100) 应该有帮助。
  • @MohammadAliBaydoun 谢谢!
  • 使用真正“阻塞”的队列比在应用中引入平均 50 毫秒的延迟要好。

标签: android multithreading networking android-activity communication


【解决方案1】:

通常的解决方案是添加一个轮询间隔,例如:每次迭代后让线程休眠 500 毫秒。但在这种情况下,没有必要这样做,因为我们不必轮询BlockingQueue。来自doc

Queue 还支持在检索元素时等待队列变为非空的操作,以及在存储元素时等待队列中可用空间的操作。

如果我们使用BlockingQueue,那么如果队列为空,则 queue.pop() 调用会阻塞并保持阻塞状态,直到有条目被推入队列。因此不需要循环。

但是,我们需要某种机制来防止线程终止。这是一个简单的例子:

public void run() {
    try {
    while (true) {
        handleServerIO(queue.take());
        }
    }catch (InterruptedException ex) {          
     ... handle ...
    }
}

【讨论】:

  • 正要说同样的话。如果你让它一直运行,它会因为你一直保持 CPU 忙碌而变得无响应,最终会收到 ANP 消息。
  • 太棒了。我没有考虑到!
  • 海报说队列是“BockingQueue”,我认为这意味着“阻塞”??轮询循环中的 Sleep() 调用只是蹩脚。
  • 引入了 250 毫秒的自动平均延迟。
  • @MartinJames 一点也不。紧跟在while(true) 之后的sleep 在每个while(!queue.isEmpty()) 批评之间放置一个延迟。这样,如果我将 100 条消息放入队列,队列将每 500 毫秒检查一次,一旦检测到有消息要处理,内循环while(!queue.isEmpty()) 将立即处理它们。另一方面,如果我不输入sleep,它将尽可能快地检查内部while条件。
猜你喜欢
  • 2012-11-14
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2021-04-30
  • 1970-01-01
相关资源
最近更新 更多