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



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

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沟通呢?

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

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

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

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

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

最新更新