2013-05-09 34 views
0

我試圖用Android連接套接字。我知道你不能從MainThread打開網絡連接。我創建了一個AsyncTask來完成它。我在主類中創建了私有類,我在網上看到了一些關於這個類的例子。android.os.NetworkOnMainThreadException AsyncTask

有人可以幫我瞭解它是什麼錯?我想這是我試圖連接的方式的一個錯誤,因爲我已經使用普通的Java類連接到服務器。 我編輯了manisfest以提供必要的權限。

如果有人對更好的方法有任何建議,那就太好了。

public class MainActivity extends Activity { 

    private ObjectInputStream input; 
    private ObjectOutputStream output;   
    private Button buttonCreateRoom; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     buttonCreateRoom = (Button)findViewById(R.id.buttonCreate); 


     //buttons  
     buttonCreateRoom.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       onClickButton(ConstantsRooms.CREATE_ROOM); 
      } 
     }); 


    } 

    private void onClickButton(int numberButton){ 
     RequestMessage request = null; 

     switch (numberButton) { 
      .... 
     } 

     AsyncButtons asyncButtons = new AsyncButtons(); 
     asyncButtons.execute(request); 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 




    //Botones 
    private class AsyncButtons extends AsyncTask<RequestMessage, ResponseMessage, Void> { 
     private Socket socket; 

     @Override 
     protected Void doInBackground(RequestMessage... params) { 
      RequestMessage request; 
      ResponseMessage response; 
      Void v = null; 
      try{ 

       request = params[0];      
       output.writeObject(request); 
       output.flush();  

       response = (ResponseMessage)input.readObject(); 

      ... 
     } 


     @Override 
     protected void onPreExecute() { 

      try{ 
       // Setup networking 
       **socket = new Socket(ConstantsRooms.SERVER_ADDRESS, ConstantsRooms.PORT_PUBLIC); -->ERROR** 
       socket.setTcpNoDelay(true); 
       output = new ObjectOutputStream(socket.getOutputStream()); 
       output.flush(); 
       input = new ObjectInputStream(socket.getInputStream()); 

      }catch (Exception exp){ 
       Log.e(TAG, "Excepcion socket ---"); 
       exp.printStackTrace(); 
      } 
     }   
    } 

} 

回答

1

根據DOC here

onPreExecute(),調用任務之前UI線程上執行。 此步驟通常用於設置任務,例如通過在用戶界面中顯示 進度條。

中調用UI線程上執行的doInBackground

+0

謝謝,它的工作。 – Guille 2013-05-09 10:09:44

0

onPreExecute()你的網絡的事情。因此,在onPreExecute中創建套接字連接會導致NetWorkOnMainThreadException。移動代碼的那部分doInbackground()

移動嘗試捕捉在onPreExecute()來doInbackground()

有關更多信息,請在下面的鏈接特別主題的文檔下4個步驟

http://developer.android.com/reference/android/os/AsyncTask.html

相關問題