устранение задержки при отправке строки через tcp / ip - PullRequest
0 голосов
/ 23 мая 2011

В моем проекте есть переключатель освещения, который имеет IP-адрес и порт и принимает строки для управления. Я пытаюсь создать приложение для включения и выключения. Мой код работает, однако после первого щелчка существует значительная задержка между следующим щелчком и фактическим переключением переключателя.

У меня есть кнопка для включения и выключения. main.java:

package com.android.lswitch;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class lightswitch extends Activity {
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Handle swon button
    Button swon = (Button) findViewById(R.id.swon);
    swon.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            sw(true);
        }
    });

    // Handle swoff button
    Button swoff = (Button) findViewById(R.id.swoff);
    swoff.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            sw(false);
        }
    });


}

private void sw(boolean swstate) {
    if (swstate == true) {
        Thread swonThread = new Thread(new swon());
        swonThread.start();    
    }

    if (swstate == false) {
    Thread swoffThread = new Thread(new swoff());
    swoffThread.start();    
    }

}
}

и кнопка на Java: пакет com.android.lswitch;

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class swon implements Runnable {
public static final String SERVERIP = "10.0.0.25";
public static final int SERVERPORT = 4000;


public void run(){
try {
    InetAddress serverAddr = InetAddress.getByName(SERVERIP);

    Socket socket = new Socket(serverAddr, SERVERPORT);

    String swon = "A55A6B0550000000FFFBDE0030C8";
    String but0 = "A55A6B0500000000FFFBDE002066";

    PrintWriter out = new PrintWriter( new BufferedWriter
            ( new OutputStreamWriter(socket.getOutputStream())),true);

    out.println(swon);
    out.println(but0);
    socket.close();
} catch(Exception e) {
}
    finally {

    }
}
}

кнопка выключения практически одинакова, но с разными строками. Я новичок в кодировании Android (и Java-кодирование), поэтому не могу видеть, где задержка. Нужно ли где-нибудь смыть струны? или есть лучший способ заняться этим проектом?

Приветствия

1 Ответ

1 голос
/ 23 мая 2011

PrintWriter может быть буферизовано, поэтому вы должны определенно flush() сделать это перед выполнением любой операции close() на базовом сокете.

Также предпочтительно вызывать PrintWriter.close() вместо Socket.close()например, в блоке finally, например:

PrintWriter out = new PrintWriter( new BufferedWriter
        ( new OutputStreamWriter(socket.getOutputStream())),true);

try {
  out.println(swon);
  out.println(but0);
  out.flush();
} finally {
  out.close();
}
...