2016-07-13 9 views
0

)新しいRunnableを((新しいスレッドで私のトーストメッセージを参照してくださいカント。私は接続とdisconection後にメッセージを表示して少し問題を抱えている

私の接続ボタンを押して、取得するために、新しいスレッドで通信を確立するときに私がしようとしていますトーストメッセージ:あなたが接続されていると私は例外でトーストを取得するために接続されていない午前場合も:あなたが接続されていない

は、私は自分のコードの末尾に

runOnUiThread(new Runnable() /*but then It underline*/}).start();で新しいスレッドを交換しようとしました間違い。開始を削除してアプリを実行すると、サーバーに接続できなくなる。

私は多くのソリューションを試しましたが、どれもうまくいきませんでした。私が助けてくれれば非常に感謝しています。

@Override 
    public void onClick(View v) { 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
      server = serverTxt.getText().toString(); 
       Socket socket = new Socket(server, port); 
       socket.setSoTimeout(30000); 
       connected = true; 
       Toast.makeText(getApplicationContext(), "You are connected",Toast.LENGTH_LONG).show(); 
      //send the message to the server 
       here = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 

      } catch (Exception e) { 
        Toast.makeText(getApplicationContext(), "You are not connected",Toast.LENGTH_LONG).show(); 
      } 
     } 
    }).start(); 
    } 
    }); 
+0

フラグメント内でこれを実行しようとしていますか? – Kushan

+0

1)runOnUiThread呼び出し後に.start()が必要ありません。 2)runOnUiThread内でソケットコードを使用しようとするとNetworkOnMainThread例外がスローされます - >トースト部分のみを使用 – Kushan

答えて

0

次のようにrunOnUiThreadを使用する必要があります。

は、UIスレッドでソケット部を使用しないでください、ITはrunOnUiThreadがメソッドであるEXCEPTION

new Thread(new Runnable() { 
@Override 
public void run() { 
    try { 
    server = serverTxt.getText().toString(); 
     Socket socket = new Socket(server, port); 
     socket.setSoTimeout(30000); 
     connected = true; 

    //if inside a fragment, call with getActivity().runOnUiThread() 
    Activity.this.runOnUiThread(new Runnable(){ 

     public void run(){ 

      Toast.makeText(getApplicationContext(), "You are connected",Toast.LENGTH_LONG).show(); 

     } 
    }); 
    //send the message to the server 
     here = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 

    } catch (Exception e) { 

    //if inside a fragment, call with getActivity().runOnUiThread() 
    Activity.this.runOnUiThread(new Runnable(){ 

     public void run(){ 

      Toast.makeText(getApplicationContext(), "You are not connected",Toast.LENGTH_LONG).show(); 

     } 
    }); 

    } 
} 

}).start(); 

がスローされます。 .start()はThreadオブジェクトに対してのみ機能し、新しいスレッドを開始するために使用されます。ここであなたのUI(既に実行中の)スレッドがフォーカスを取るようにしてください:)

+0

getActivity()を呼び出してください。runOnUiThread(new Runnable().... – Kushan

+0

私はコードを試しましたが、私が接続していないときにdoestが表示されます –

+0

どこでソケット部分を使うことができますか? –

3

UIスレッドでトーストを表示する必要があります。これを行うにはハンドラを使うことができます。

Handler handler = new Handler(Looper.getMainLooper()); 
handler.postRunnable(new Runnable() { 
    @Override 
    public void run() { 
     Toast.makeText(getApplicationContext(), "You are connected",Toast.LENGTH_LONG).show(); 
    } 
}); 
+2

uiのアプリケーションコンテキストを使用しない – Blackbelt

+0

postRunnableに下線が引かれます –

+0

これはちょうどpost()です。 – CaseyB

0

runOnUiThreadの方法で使用してください。例えば

activity.this.runOnUiThread(new Runnable() { 
    public void run() { 
     Toast.makeText(getApplicationContext(), "Message", Toast.LENGTH_SHORT).show(); 
    } 
}); 
0

はAsyncTaskを使用することを検討してください。 onPostExecute内でUIにアクセスでき、トースト通知を行うことができます

private class operation extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... params) { 
      try { 
       server = serverTxt.getText().toString(); 
       Socket socket = new Socket(server, port); 

       socket.setSoTimeout(30000); 
       connected = true; 

       return "You are connected"; 
       //send the message to the server 
       here = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
      } catch (Exception e) { 
       return "You are not connected" 

      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
     } 

    } 
関連する問題