2

非常に単純な双方向 IM アプリをテストしようとしています。クライアントがAndroid上にあり、サーバーが私のPC(Java)上にある場合。PC から PC への Java でこのアプリをテストしましたが、正しく動作します。

しかし、Androidエミュレーターで、PCからAndroidエミュレーターにメッセージを送信すると、PCから2回送信されたときにのみメッセージがAndroidに表示されます。PCから送信ボタンを1回クリックしても何も表示されず、もう一度クリックするとAndroidにメッセージが表示されます。

実行可能なメソッドに問題があると考えていますが、完全にはわかりません。誰かが問題を指摘してくれることを願っています。前もって感謝します。

static Socket kkSocket = null;
static PrintWriter out = null;
static BufferedReader in = null;

static String msg;
TextView tv;
EditText et;

Handler mHandler = new Handler();

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

tv = (TextView) findViewById(R.id.tv_message);
et = (EditText) findViewById(R.id.et_message);

Button btnSend = (Button) findViewById(R.id.btn_send);
btnSend .setOnClickListener(new View.OnClickListener() 
{
public void onClick(View v) {   

out.println(et.getText());

}
});     

Thread t = new Thread() {
    public void run() {
processThread();        
    }
};

t.start();

}

private void processThread() {

              try {
                    kkSocket = new Socket("xxx.xx.xx.xxx", 4444);
                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    out = new PrintWriter(kkSocket.getOutputStream(), true);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }                   


                try {
                    in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


                try {
                    while (in.readLine() != null)
                    {
                        msg = in.readLine();
                        mHandler.post(mUpdateResults);                      
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

}

Runnable mUpdateResults = new Runnable() {
 public void run() {
    tv.setText("Server: " + msg);
 }
};
4

1 に答える 1

1

すべてのメッセージの後に改行文字が送信されていますか?

バッファリングされたリーダーが、改行文字の待機をブロックしている可能性があります。

于 2011-07-17T09:28:00.643 に答える