2012-05-13 43 views
0

我想爲Android編碼一個簡單的聊天應用程序,所以我有一個聊天服務器,我試圖連接到它。因此,在主類我有從AsyncTask在Android中做網絡給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是一類,我只是保持插槽和四個EditText組件。想法是SetNetworking將建立網絡連接並且Messager將發送消息。這兩個類實現AsyncTask

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

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

但奇怪的是,在MessageronPostExecute(Void result),當我嘗試做甚至是很簡單的事情

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()); 
} 

我得到這個:

測試不工作! android.os.NetworkOnMainThreadException

爲什麼既然它在AsyncTask中而不在主線程中?

+2

onPostExecute在主線程上完成... – Selvin

回答

1

由於該方法在UI線程上運行,因此無法在onPostExecuteonPostExecute中執行網絡I/O。您需要執行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);'結果是真的。在清單中我有'<使用權限android:name =「android.permission.INTERNET」/>'可能是什麼原因? – RegedUser00x

+0

@ RegedUser00x - 我不明白 - 返回false是什麼,什麼是返回true?它看起來像相同的代碼。也許你應該開始一個單獨的問題,顯示相關的代碼。 –

0

Messager類的onPostExecute()在主線程上完成。您也在使用網絡IO

InetAddress.getByName(「130.237.161.23」);

相關問題