java - Android:Socket-Connection 导致延迟和大量 GC 操作

标签 java android sockets garbage-collection

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

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

}

最佳答案

You should not repeatedly poll ready() to test whether there is data to be read. Just call readLine(). It will block the thread until there is data to be read or the connection is closed.

对于读取 block 来说是一个很好的建议,但是每次处理数据时都会创建新的Intent,您可以重用这个对象吗?这就是导致 GC 变得疯狂的部分。

希望这对您有所帮助并祝您工作愉快。

关于java - Android:Socket-Connection 导致延迟和大量 GC 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16566240/

相关文章:

java - GC 是否将内存释放回操作系统?

java - 如何将 ArrayList 中对象的所有值的总成本相加?

java - 在 JavaFX 中绑定(bind)字体大小?

android - 无法使用 SQLiteDatabase.openDatabase() 打开 android 数据库

c - 没有从开关盒中出来

java - 流 readLine 以中断方式关闭

Android Google+ 集成有时会返回空值

android - Activity 开始时缺少 Intent extra

sockets - 生成百万tcp连接的最佳方式

sockets - Julia TCP 选择