0

这是一个带有套接字连接的线程。

服务器向这个套接字发送随机整数(每 10 毫秒)。问题是,过了一会儿,接收数据的延迟很大,LogCat 打印出很多“GC_CONCURRENT freed”消息。

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);
    }
}

}

4

2 回答 2

1

您不应该反复轮询 ready() 来测试是否有数据要读取。只需调用 readLine()。它将阻塞线程,直到有数据要读取或连接关闭。

对读取块是一个很好的建议,但是您每次处理数据时都在创建新的 Intent,您可以重用这个对象吗?这是导致你的 GC 发疯的部分。

希望这对您有所帮助并享受您的工作。

于 2013-05-15T13:44:09.077 回答
0

不应反复轮询ready()以测试是否有数据要读取。只要打电话readLine()。它将阻塞线程,直到有数据要读取或连接关闭。

但我认为这不是产生垃圾的原因。我怀疑这与您对正在阅读的行所做的事情有关。我知道使用意图涉及 Java 对象流,并且它们在序列化和反序列化过程中使用的内存方面相当重要。看起来你可以在多个地方进行反序列化......取决于监听广播意图的内容。

于 2013-05-15T13:35:22.313 回答