2013-09-28 1 views
1

Насколько нам известно, мы не можем выполнить веб-соединение в потоке пользовательского интерфейса и пытаться выполнить его на Thread или AsyncTask, и я решил запустить веб-соединение в runnable Thread. Когда я нажимаю кнопку, журнал показывает мне, что код с connection.connect(); оказался исключением NetworkOnMainThreadException, но, как вы знаете, из моего кода ниже я уже написал свой код networkconnecton в потоке, так что кто-нибудь покажет мне правильный способ справиться с Эта проблема?One Strange NetWorkOnMainThreadException

public class MainActivity extends Activity { 

    private Button btn_send; 
    private EditText et_content; 


    private Connection connection; 

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

     btn_send = (Button) findViewById(R.id.bt_sendms); 

     et_content = (EditText) findViewById(R.id.et_inputcontent); 

     btn_send.setOnClickListener(onClicListener); 

    } 

    public OnClickListener onClicListener = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      handler.post(task); 
     } 

    }; 

    private Handler handler = new Handler(); 

    private Runnable task = new Runnable() { 



     @Override 
     public void run() { 
      // TODO Auto-generated method stub 

      XMPPConnection.DEBUG_ENABLED = true; 

     ConnectionConfiguration connectionConfig = new ConnectionConfiguration(
        "192.168.1.108", Integer.parseInt("5222"), "dell-PC"); 

      AccountManager accountManager; 

      connectionConfig.setReconnectionAllowed(true); 
      connectionConfig.setSendPresence(true); 

      connection = new XMPPConnection(connectionConfig); 

      try { 

       connection.connect(); 
       accountManager = connection.getAccountManager(); // 
       connection.login("admin", "888889"); 
       ChatManager chatManager = connection.getChatManager(); 

       Chat newChat = chatManager.createChat("[email protected]", 
         new MessageListener() { 

          @Override 
          public void processMessage(Chat chat, 
            Message message) { 

          } 
         }); 

       try { 
        newChat.sendMessage(et_content.getText().toString()); 
       } catch (XMPPException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       et_content.setText(""); 

      } catch (XMPPException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } // 

     } 

    }; 

} 
+1

Не используйте 'Handler'. Он работает на том же самом потоке, который связан, в случае основного потока пользовательского интерфейса. http://developer.android.com/reference/android/os/Handler.html – Simon

ответ

0

Вы создаете обработчик на нитке ui. Вы запускаете свою связанную с сетью операцию в методе runnable run. Таким образом, вы выполняете сетевую работу по потоку ui.

Используйте Thread или Asynctask

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

Цитирование из doscs

Каждый экземпляр обработчика связано с одного потока и очереди сообщений этого потока. Когда вы создаете новый обработчик, он привязан к очереди потоков/сообщений потока, который его создает - с этой точки он будет доставлять сообщения и runnables в очередь сообщений и выполнять их по мере их выхода из очередь сообщений.

При запуске связанных с сетевой операции на пользовательском интерфейсе после соты вы получите NetworkOnMainThreadException

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

+0

благодарю вас Рагхунандан! – bryanwu

+0

@bryanwu, вы можете использовать asynctask его проще. – Raghunandan