这是一个带有套接字连接的线程。
服务器向此套接字发送随机int数(每10毫秒)。 问题是,经过一段时间后,接收数据的时间很长,而LogCat会打印大量“GC_CONCURRENT释放”消息。
public class TcpSocketThread extends Thread {
Context context;
String ip;
int port;
public TcpSocketThread(Context con, String ip, int port) {
context = con;
this.ip = ip;
this.port = port;
}
@Override
public void run() {
Socket client;
try {
client = new Socket(ip, port);
BufferedReader in = new BufferedReader(new InputStreamReader(
client.getInputStream()));
String msg;
while (true) {
if (in.ready()) {
msg = in.readLine();
Intent intent = new Intent(BLUETOOTH_DATA);
intent.putExtra(BLUETOOTH_DATA_STRING, msg);
context.sendBroadcast(intent);
Log.v("Tcp-Socket-Thread", "msg: " + msg);
}
}
} catch (UnknownHostException e) {
Log.v("client", "unknown host" + e);
} catch (IOException e) {
Log.v("client", "No I/O" + e);
}
}
}
答案 0 :(得分:1)
您不应重复调查ready()以测试是否有要读取的数据。只需调用readLine()即可。它将阻塞线程,直到有数据要读取或连接关闭为止。
对于读取块是一个很好的建议,但是每次处理数据时都要创建新的Intent,是否可以重用此对象?这是导致你的GC疯狂的部分。
希望这有助于并享受您的工作。
答案 1 :(得分:0)
您不应重复轮询ready()
以测试是否有要读取的数据。只需致电readLine()
即可。它会阻塞线程,直到有数据要读取或连接关闭为止。
但我认为这不会产生垃圾。我怀疑这与您正在阅读的行所做的事情有关。我知道使用意图涉及Java对象流,并且就它们在序列化和反序列化过程中使用的内存而言,它们相当重。并且看起来你可以在多个地方进行反序列化...取决于听广播意图的内容。