在另一个线程内设置套接字连接

时间:2015-02-02 14:30:26

标签: android

我使用以下代码连接到套接字服务器:

XMPPConnection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
        Thread t=new Thread(new Runnable() {

            @Override
            public void run() {
                ConnectionConfiguration connConfig=new ConnectionConfiguration("178.62.84.123", 5222,"localhost");
                connection=new XMPPTCPConnection(connConfig);
                try{
                    connection.connect();
                }catch(XMPPException ex) {
                    setConnection(null);
                } catch (SmackException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        t.start();
}
private void onPause() {
     try {
          connection.disconnect();
     } catch (NotConnectedException e) {
          e.printStackTrace();
     }
}

我在线程中设置connection变量。但是当我尝试断开我的应用程序崩溃时。

logcat的:

02-02 14:16:15.080: E/XMPPConnection(8047): Error in listener while closing connection
02-02 14:16:15.080: E/XMPPConnection(8047): android.os.NetworkOnMainThreadException
02-02 14:16:15.080: E/XMPPConnection(8047):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
02-02 14:16:15.080: E/XMPPConnection(8047):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
02-02 14:16:15.080: E/XMPPConnection(8047):     at java.net.InetAddress.getLocalHost(InetAddress.java:365)
02-02 14:16:15.080: E/XMPPConnection(8047):     at org.jivesoftware.smackx.bytestreams.socks5.Socks5Proxy.<init>(Socks5Proxy.java:108)
02-02 14:16:15.080: E/XMPPConnection(8047):     at org.jivesoftware.smackx.bytestreams.socks5.Socks5Proxy.getSocks5Proxy(Socks5Proxy.java:163)

为什么尝试与ui线程断开连接?我在另一个帖子中设置connection

Ps:我跟着这个:http://developer.samsung.com/technical-doc/view.do?v=T000000119

1 个答案:

答案 0 :(得分:1)

在此示例中,在线程内调用断开连接,因此它不会阻止等待网络消息的UI。但是,在此示例中,我不重新连接,您应该将其实现为正确的状态(可能是OnResume)。

XMPPConnection connection = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
        Thread t=new Thread(new Runnable() {

            @Override
            public void run() {
                ConnectionConfiguration connConfig=new ConnectionConfiguration("178.62.84.123", 5222,"localhost");
                connection=new XMPPTCPConnection(connConfig);
                try{
                connection.connect();
            }catch(XMPPException ex) {
                setConnection(null);
            } catch (SmackException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    });
    t.start();
}
private void onPause() {
    Thread t=new Thread(new Runnable() {

        @Override
        public void run() {
               try {
                    if (connection != null)
                        connection.disconnect();
               } catch (NotConnectedException e) {

               }
        }
    });
    t.start();
}