2012-05-13 7 views
0

Android用の簡単なチャットアプリをコーディングしようとしているので、チャットサーバーがあり、接続しようとしています。だから、メインクラスで私はAndroidでAsyncTaskからネットワーキングを行うと、NetworkOnMainThreadExceptionが発生します。

final EditText etHost = (EditText) findViewById(R.id.entry1); 
final EditText etPort = (EditText) findViewById(R.id.entry2); 
final EditText messageBoard = (EditText) findViewById(R.id.editText1); 
final EditText etSend = (EditText) findViewById(R.id.editText2); 

soEd = new SocketAndEditText(etHost, etPort, messageBoard, etSend); 
SetNetworking net = new SetNetworking(); 
SocketAndEditText net.execute(soEd); 
final Button sendButton = (Button) findViewById(R.id.button2); 

sendButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Messager mes = new Messager(); 
       mes.execute(soEd); 
      } 
     }); 

SocketAndEditTextを持って、私は単にソケットと4つのEditTextコンポーネントを維持するクラスです。考え方は、SetNetworkingがネットワーク接続を確立し、Messagerがメッセージを送信するということです。働いていない

テスト:私は

try { 
    InetAddress address1 = InetAddress.getByName("130.237.161.23"); 
    boolean reachable = address1.isReachable(4456); 
    messageBoard.setText("Is host reachable?" + reachable); 
} catch (Exception e) { 
    messageBoard.setText("Test not working! " + e.toString()); 
} 

としても、非常に簡単なことをしようとするとき、私はこれを取得MessageronPostExecute(Void result)

public class SetNetworking extends AsyncTask<SocketAndEditText, Void, Void> { 
... 

public class Messager extends AsyncTask<SocketAndEditText, Void, Void> { 
... 

しかし、不思議なこと:どちらのクラスはAsyncTaskを実装します! android.os.NetworkOnMainThreadException

なぜそれがメインスレッドではなくAsyncTaskにあるのですか?

+2

onPostExecuteはメインスレッドで行われます... – Selvin

答えて

1

onPostExecuteAsyncTaskのネットワークI/Oを実行することはできません。その方法はUIスレッド上で実行されるためです。 doInBackgroundですべてのネットワークアクティビティを実行する必要があります。

+0

興味深い!私はこれが私を解決するのに役立つと思うhttp://stackoverflow.com/questions/6622101/networkonmainthread-exception-while-executing-httprequest-in-a-bound-service-fro/10037830#10037830 – Shine

+0

それは問題を解決したが、私は持っている別のもの:falseを返す(すなわち、アドレスが到達可能でなく、同じコードを実行すると) 'InetAddress address1 = InetAddress.getByName(" 130.237.161.23 "); boolean reachable = address1.isReachable(4456);結果はtrueです。マニフェストでは、私は ''原因は何か? – RegedUser00x

+0

@ RegedUser00x - 私は理解していません - 何が偽を返すのか、そして真実を返すのでしょうか?それは同じコードのように見えます。おそらく、関連するコードを表示する別の質問を開始する必要があります。 –

0

MessagerクラスのonPostExecute()は、メインスレッドで実行されます。あなたはまたネットワークIOをしています

InetAddress.getByName( "130.237.161.23");

関連する問題