Android:Socket-Connection导致滞后和很多GC操作

时间:2013-05-15 13:23:51

标签: java android sockets garbage-collection

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

服务器向此套接字发送随机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);
    }
}

}

2 个答案:

答案 0 :(得分:1)

  

您不应重复调查ready()以测试是否有要读取的数据。只需调用readLine()即可。它将阻塞线程,直到有数据要读取或连接关闭为止。

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

希望这有助于并享受您的工作。

答案 1 :(得分:0)

您不应重复轮询ready()以测试是否有要读取的数据。只需致电readLine()即可。它会阻塞线程,直到有数据要读取或连接关闭为止。

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