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

问题描述 投票:0回答:2

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

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
,一旦启动,它就会保持与服务器的连接(这样
DataInputStream
PrintWriter
就不会每次都被初始化)。我希望线程能够响应:当我单击
Button
时,它应该立即向服务器发送一条消息进行处理。

我已经实现了

Handler
用于沟通
Thread->Activity
。但如何沟通
Activity->Thread

欢迎任何提示。

android multithreading networking android-activity communication
2个回答
2
投票

通常解决方案是添加轮询间隔,例如:每次迭代后让线程休眠 500 毫秒。但在这种情况下就没有必要了,因为我们不需要轮询

BlockingQueue
。来自文档

A

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

如果我们使用

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

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

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

0
投票

为了防止Android手机因无限线程循环而过热,请确保高效的线程管理,对长时间运行的操作使用异步任务,并优化代码以最大限度地减少CPU使用率。过热可能会损坏您的设备,因此及时解决此类问题至关重要。

© www.soinside.com 2019 - 2024. All rights reserved.