2017-10-11 9 views
1

これはアンドロイドの私の最初のアプリで、TCPクライアントを作成しようとしています。TCPパケットを送信するときにプログラムがクラッシュする

これまでのところ、私はpython TCPサーバーを持っていて、それをpython TCPクライアントでテストしましたが、正常に動作します。

TCPクライアントの例をhereから取得しました。

私はアプリを起動すると、wiresharkで接続が確立されるようにハンドシェイクを確認できます。

今、問題はメッセージを送信することです。れるtcpClientクラスで

public void ChangeButtonState(View view) 
{ 
    boolean state = ((ToggleButton) view).isChecked(); 
    if (state) 
    { 

     if (mTcpClient != null) { 
      mTcpClient.sendMessage("testing"); 
     } 


     textView.setText("button is on. sent Tcp message. "); 
     textView.setVisibility(View.VISIBLE); 
    } else { 
     textView.setText("button is off"); 
    } 
} 

ラインmBufferOut.println(message);上のコードがクラッシュする:私は、関数呼び出しの主な活動で

if (mTcpClient != null) 
{ 
    mTcpClient.sendMessage("testing"); 
} 

に置くとき。

しかし、TcpClientクラスのmBufferOut = new PrintWriter(socket.getOutputStream());行の直後にこの関数を呼び出すと、クライアントはメッセージを送信し、サーバーはメッセージを受信して​​クライアントに返します。

私の質問はなぜコードがクラッシュするのですか? mTcpClientメンバーはnullではありません。

+0

メインスレッドからこのコードを実行していますか?スタックトレースを共有してください –

答えて

0

バックグラウンドスレッドでネットワーク要求を送信する必要があります。 AsyncTaskまたはThreadを使用してください。

new Thread(new Runnable(){ 
    public void run(){ 
     mTcpClient.sendMessage("test"); 
    } 
}).start(); 
+0

ありがとう!問題を解決しました。とにかくそれはスレッド上にあるべきですか? – user1673206

+0

うれしい私は助けることができます。フォアグラウンドスレッドでネットワークリクエストを送信すると、リクエストが完了するまでアプリはフリーズします。したがって、アンドロイドSDKは開発者にバックグラウンドスレッドでネットワークコールを実行させるよう強制しています。 –

関連する問題