0

これはソケット接続を持つスレッドです。

サーバーはランダムな 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);
    }
}

}

4

2 に答える 2

1

読み取るデータがあるかどうかをテストするために、ready() を繰り返しポーリングしないでください。readLine() を呼び出すだけです。読み取るデータがあるか、接続が閉じられるまで、スレッドをブロックします。

読み取りブロックの良い提案ですが、データを処理するたびに新しいインテントを作成しています。このオブジェクトを再利用できますか? これが GC を狂わせる部分です。

これが役に立ち、あなたの仕事を楽しんでくれることを願っています。

于 2013-05-15T13:44:09.077 に答える
0

ready()読み取るデータがあるかどうかをテストするために、繰り返しポーリングしないでください。電話するだけreadLine()です。読み取るデータが存在するか、接続が閉じられるまで、スレッドをブロックします。

しかし、それがゴミを生み出しているとは思いません。それは、あなたが読んでいる行であなたがしていることと関係があるのではないかと思います. インテントの使用には Java オブジェクト ストリームが関与し、シリアライゼーションおよびデシリアライゼーション プロセスで使用するメモリの点でかなり重いことを理解しています。そして、ブロードキャストされたインテントをリッスンするものに応じて、複数の場所で逆シリアル化を実行できるようです。

于 2013-05-15T13:35:22.313 に答える