2013-05-09 51 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

相关问题