Android:线程无限循环/手机过热

时间:2014-08-19 15:10:53

标签: android multithreading networking android-activity communication

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

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

欢迎任何提示。

1 个答案:

答案 0 :(得分:2)

一般来说,解决方案是添加轮询intervall,例如:在每次迭代后将线程休眠500ms。但在这种情况下没有必要,因为我们不必轮询BlockingQueue。来自doc

  

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

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

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

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