2013-04-07 72 views
2

我很抱歉格式提前。 我是新十歲上下的Android開發,我上的XMPP客戶合作,同服務器在家裏辦通過谷歌的命令談論機器人....aSmack崩潰與NetworkOnMainThreadException

  1. 我沒看計算器的一些答案並通過github上
  2. 一派一些答案
  3. 我更新到最新ASMACK LIB
  4. 我沒有添加使用許可
  5. 我ASMACK就在我的Android測試應用程序的工作。

我將工作代碼複製到我的應用程序中我正在嘗試並給出錯誤......就像我說的我是新的,並且在10年內沒有完成java編程..我不知道如何聽到錯誤堆棧

我有一個名爲'Setting Dialog'的設置對話框。當我按一下按鈕我運行此:

protected void onStart() { 
    super.onStart(); 
    setContentView(R.layout.settings); 
    getWindow().setFlags(4, 4); 
    setTitle("XMPP Settings"); 
    Button ok = (Button) findViewById(R.id.ok); 
    ok.setOnClickListener(new View.OnClickListener() 
    { 
      @Override 
      public void onClick(View v) 
      { 
       String host = HOST_ADDRESS; 
       int port = HOST_PORT_NUM; 
       String service = HOST_SERVICE; 
       String username = "[email protected]";//getText(R.id.userid); 
       String password = "abc123";//getText(R.id.password); 

       // Create a connection 
       ConnectionConfiguration connConfig = new ConnectionConfiguration("talk.google.com", 5222, "gmail.com"); 
       XMPPConnection XMPPCon = new XMPPConnection(connConfig); 
       try 
       { 
        XMPPCon.connect(); 
        XMPPCon.login(username,password); 

       } 
       catch (XMPPException ex) 
       { 
        ex.printStackTrace(); 
        HomeBotClient.setConnection(null); 
       } 
       HomeBotClient.setConnection(XMPPCon); 
       dismiss(); 
      } 

    } 
    ); 
} 

,當我按下按鈕調用的主要活動

public void setConnection (XMPPConnection XMPPCon) {

this.XMPPCon = XMPPCon; 
    if (XMPPCon != null) 
    { 
     ChatManager chatmanager = XMPPCon.getChatManager(); 
     Chat newChat = chatmanager.createChat("[email protected]",new MessageListener() 
     { 
      public void processMessage(Chat chat, Message message) { 
       try 
       { 
        Log.v(TAG, "Got:" + message.getBody()); 
        chat.sendMessage(message.getBody()); 
       } 
       catch (XMPPException e) 
       { 
        e.printStackTrace(); 
        Log.v(TAG, "Couldn't respond:" + e); 
       } 
       Log.v(TAG, message.toString()); 
       } 
     }); 
     try 
     { 
      newChat.sendMessage("OMNOMNOM"); 
     } 
     catch (XMPPException e) 
     { 
      e.printStackTrace(); 
      Log.v(TAG, "couldn't send:" + e.toString()); 
     } 

      // Accept only messages from [email protected] 
      PacketFilter filter 
       = new AndFilter(new PacketTypeFilter(Message.class), 
           new FromContainsFilter("[email protected]")); 

      // Collect these messages 
      PacketCollector collector = XMPPCon.createPacketCollector(filter); 

      while(true) { 
      Packet packet = collector.nextResult(); 

      if (packet instanceof Message) 
      { 
       Message msg = (Message) packet; 
       // Process message 
       Log.v(TAG, "Got message:" + msg.getBody()); 
      } 
      } 
    } 
} 

我得到這個錯誤此一功能「setConnection」

04-07 17:21:15.011: E/AndroidRuntime(1099): FATAL EXCEPTION: main 04-07 17:21:15.011: E/AndroidRuntime(1099): android.os.NetworkOnMainThreadException 04-07 17:21:15.011: E/AndroidRuntime(1099): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 04-07 17:21:15.011: E/AndroidRuntime(1099): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 04-07 17:21:15.011: E/AndroidRuntime(1099): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 04-07 17:21:15.011: E/AndroidRuntime(1099): at java.net.InetAddress.getAllByName(InetAddress.java:214) 04-07 17:21:15.011: E/AndroidRuntime(1099): at org.jivesoftware.smack.proxy.DirectSocketFactory.createSocket(DirectSocketFactory.java:49) 04-07 17:21:15.011: E/AndroidRuntime(1099): at org.jivesoftware.smack.XMPPConnection.connectUsingConfiguration(XMPPConnection.java:576) 04-07 17:21:15.011: E/AndroidRuntime(1099): at org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:1034) 04-07 17:21:15.011: E/AndroidRuntime(1099): at com.ps.homebotclient.SettingsDialog$1.onClick(SettingsDialog.java:53) 04-07 17:21:15.011: E/AndroidRuntime(1099): at android.view.View.performClick(View.java:4204) 04-07 17:21:15.011: E/AndroidRuntime(1099): at android.view.View$PerformClick.run(View.java:17355) 04-07 17:21:15.011: E/AndroidRuntime(1099): at android.os.Handler.handleCallback(Handler.java:725) 04-07 17:21:15.011: E/AndroidRuntime(1099): at android.os.Handler.dispatchMessage(Handler.java:92) 04-07 17:21:15.011: E/AndroidRuntime(1099): at android.os.Looper.loop(Looper.java:137) 04-07 17:21:15.011: E/AndroidRuntime(1099): at android.app.ActivityThread.main(ActivityThread.java:5041) 04-07 17:21:15.011: E/AndroidRuntime(1099): at java.lang.reflect.Method.invokeNative(Native Method) 04-07 17:21:15.011: E/AndroidRuntime(1099): at java.lang.reflect.Method.invoke(Method.java:511) 04-07 17:21:15.011: E/AndroidRuntime(1099): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-07 17:21:15.011: E/AndroidRuntime(1099): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 04-07 17:21:15.011: E/AndroidRuntime(1099): at dalvik.system.NativeStart.main(Native Method)

+0

...有它的工作 – 2013-04-08 01:45:46

回答

2

僅供參考android.os.NetworkOnMainThreadException僅當您嘗試調用主UI線程上的Web服務調用等長時間運行的進程時纔會發生。它在< 2.3設備中效果最好,但如果您尚未將它包含在線程中並嘗試在> 3.0設備上運行它,它會給您帶來NetworkOnMainThreadException。

要解決它,你可以實現的AsyncTask(一種標準方式)或包括下面的代碼(偷懶的方法):

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

檢查和了解更多關於NetworkOnMainThreadException在:啓動一個新的線程需要Android StrictMode – NetworkOnMainThreadException

2

Android 4.0或更高版本不允許網絡I/O操作在GUI線程中,如果你這樣做,它將拋出一個NetworkOnMainThread異常。爲了防止這種情況,aSmack自帶AndroidConnectionConfiguration,它提供

  • AndroidConnectionConfiguration(String serviceName)
  • AndroidConnectionConfiguration(String serviceName, int timeout)
  • AndroidConnectionConfiguration(String host, int port, String name)

其中,當使用時,將產生一個新的線程,並且因此防止了異常。