繁体   English   中英

Android XMPP连接不是持久性的-asmack库甚至在单独的线程中运行

[英]Android XMPP connection is not persistant - asmack library even running in a separate thread

我正在开发一个使用asmack库的Android聊天应用程序。 我观察到XMPP连接在特定时间间隔后断开连接。 (这也因设备而异)

我正在按照以下链接中的说明在单独的线程中运行连接代码

无法使用aSmack 4.0.2建立新连接

但我得到以下异常

D/Reconnection Manager(23105): scheduleReconnect: calling tryToConnect
I/System.out(23105): default ping interval is :10
W/System.err(23105): org.jivesoftware.smack.SmackException$ConnectionException
W/System.err(23105):    at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:436)
W/System.err(23105):    at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:811)
W/System.err(23105):    at org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:396)
W/System.err(23105):    at com.connectlinks.service.ChatService.connectToXmppServer(ChatService.java:309)
W/System.err(23105):    at com.connectlinks.service.ChatService.access$0(ChatService.java:291)
W/System.err(23105):    at com.connectlinks.service.ChatService$3.run(ChatService.java:280)
W/System.err(23105):    at android.os.Handler.handleCallback(Handler.java:733)
W/System.err(23105):    at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err(23105):    at android.os.Looper.loop(Looper.java:136)
W/System.err(23105):    at android.app.ActivityThread.main(ActivityThread.java:5586)
W/System.err(23105):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(23105):    at java.lang.reflect.Method.invoke(Method.java:515)
W/System.err(23105):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
W/System.err(23105):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
W/System.err(23105):    at dalvik.system.NativeStart.main(Native Method)

不知道我要去哪里错了。 我从许多SO问题中了解到,在单独的线程中进行连接/重新连接是可行的。 但是对我来说没有发生...

下面是我正在使用的代码块

在下面,我最初连接到XMPP服务器,一切正常

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
.......
startXmppThread();
.......
}

下面的代码块是我启动XMPP线程的地方

public void startXmppThread(){
    isConnecting = true;
    SmackAndroid.init(ChatService.this);
    PingManager.setDefaultPingInterval(10);
    SmackConfiguration.setDefaultPacketReplyTimeout(20000);
    if(xmppThread == null){
        xmppThread=new Thread(xmppRunnable,"connection thread");
        xmppThread.start();
    }
}

XMPP可运行代码

Runnable xmppRunnable = new Runnable() {

    @Override
    public void run() {
        Log.d(TAG,"starting now thread :"+Thread.currentThread().getId()+" : "+Thread.currentThread().getName());
        Looper.prepare();
        try{
            connectToXmppServer();
            handler.post(mRunnableConnectionMonitor);
        }catch (Exception e) {
            //handler.removeCallbacks(mRunnableConnectionMonitor);
            Log.d(TAG, "Trying to Reconnect from the run catch exception");
            scheduleReconnect();
            e.printStackTrace();

        }

        xyzz = new Handler(new Handler.Callback() {

            @Override
            public boolean handleMessage(android.os.Message msg) {
                switch (msg.arg1) {
                case 1:
                    Log.d(TAG, "Got Message to connect again");
                    try {
                        connectToXmppServer();
                        handler.post(mRunnableConnectionMonitor);
                    } catch (Exception e) {
                        //handler.removeCallbacks(mRunnableConnectionMonitor);
                        Log.d(TAG,"Trying to reconnect from the handleMessage case 1");
                        scheduleReconnect();
                        e.printStackTrace();
                    }
                    break;

                case 2:
                    Log.d(TAG, "Got Message to disconnect");
                    handler.removeCallbacks(mRunnableConnectionMonitor);
                    try {
                        connection.disconnect();
                        Log.d(TAG, "succesfully disconnected");
                    }catch (Exception e) {
                        Log.d(TAG, "Exception while disconnecting");
                        e.printStackTrace();
                    }
                    break;
                case 3:
                    Log.d(TAG,"Trying to reconnect from the handleMessage case 3");
                    scheduleReconnect();
                    handler.removeCallbacks(mRunnableConnectionMonitor);
                    break;
                default:
                    break;
                }
                return false;
            }
        });
        Looper.loop();
    }
};

连接到XMPP服务器的代码块

private void connectToXmppServer() throws Exception {
        if(config ==null)
            config = new ConnectionConfiguration(CHAT_SERVER_IP, 5222,host);
        config.setSecurityMode(SecurityMode.disabled);
        config.setSendPresence(true);
        config.setRosterLoadedAtLogin(false);
        if(connection == null)
            connection = new XMPPTCPConnection(config);


        if(mPingManager == null)
            mPingManager = PingManager.getInstanceFor(connection);
        mPingManager.unregisterPingFailedListener(mPingFailedListener);
        mPingManager.registerPingFailedListener(mPingFailedListener);
        System.out.println("default ping interval is :"+mPingManager.getPingInterval());
        if(!connection.isConnected())
            connection.connect();

        if(!ConnectlinksApp.m_sharedHelper.getChatRegistration()){
            String mobileID = ConnectlinksApp.m_sharedHelper.getMobileID();
            Log.d(TAG, "trying to register with : "+mobileID);
            AccountManager accountManager=AccountManager.getInstance(connection);
            try{
                accountManager.createAccount(mobileID, m_strUserPassword);
                Log.d(TAG, "account created successfully"+mobileID);
            }catch (Exception e) {
                Log.d(TAG, "account already exist"+mobileID);
                e.printStackTrace();
            }
            ConnectlinksApp.m_sharedHelper.setChatRegistration(true);
        }

        if(!connection.isAuthenticated()){
            login();
        }
}

代码块whicj重新连接到XMPP服务器

protected void scheduleReconnect() {
    if (mReconnectHandler == null) mReconnectHandler = new Handler();
    mReconnectHandler.removeCallbacks(mReconnectRunnable);
    Log.d("Schedule Reconnect","scheduleReconnect: scheduling reconnect in 10 seconds");
    mReconnectHandler.postDelayed(mReconnectRunnable, 10000);
}

重新连接的可运行

private final Runnable mReconnectRunnable = new Runnable() {
    @Override
    public void run() {
        Log.d("Reconnection Manager","scheduleReconnect: calling tryToConnect");
        try{                
            connectToXmppServer();
            handler.post(mRunnableConnectionMonitor);
            Log.d(TAG, "This shold be called");
        }catch (Exception e) {
        //  handler.removeCallbacks(mRunnableConnectionMonitor);
            e.printStackTrace();
            scheduleReconnect();
        }
    }
};

我尝试了所有可能性,但未能找到解决方案。 遇到相同问题的任何人都可以帮助我。 感谢您抽出宝贵的时间阅读这篇长文章。

*******************编辑**************************异常日志为

10-23 19:48:50.866 I/System.out(15248): This is what I am looking for beginning
10-23 19:48:50.876 E/ERROR   (15248): ConnectionException
10-23 19:48:50.876 E/ERROR   (15248): org.jivesoftware.smack.SmackException$ConnectionException

10-23 19:48:50.876 E/ERROR   (15248):   at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:436)

10-23 19:48:50.876 E/ERROR   (15248):   at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:811)

10-23 19:48:50.876 E/ERROR   (15248):   at org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:396)

10-23 19:48:50.876 E/ERROR   (15248):   at com.connectlinks.service.ChatService.connectToXmppServer(ChatService.java:314)

10-23 19:48:50.876 E/ERROR   (15248):   at com.connectlinks.service.ChatService.access$0(ChatService.java:293)

10-23 19:48:50.876 E/ERROR   (15248):   at com.connectlinks.service.ChatService$3.run(ChatService.java:281)

10-23 19:48:50.876 E/ERROR   (15248):   at android.os.Handler.handleCallback(Handler.java:733)

10-23 19:48:50.876 E/ERROR   (15248):   at android.os.Handler.dispatchMessage(Handler.java:95)

10-23 19:48:50.876 E/ERROR   (15248):   at android.os.Looper.loop(Looper.java:136)

10-23 19:48:50.876 E/ERROR   (15248):   at android.app.ActivityThread.main(ActivityThread.java:5586)

10-23 19:48:50.876 E/ERROR   (15248):   at java.lang.reflect.Method.invokeNative(Native Method)

10-23 19:48:50.876 E/ERROR   (15248):   at java.lang.reflect.Method.invoke(Method.java:515)

10-23 19:48:50.876 E/ERROR   (15248):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)

10-23 19:48:50.876 E/ERROR   (15248):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)

10-23 19:48:50.876 E/ERROR   (15248):   at dalvik.system.NativeStart.main(Native Method)

10-23 19:48:50.885 E/ERROR   (15248): 54.215.XXX.YYY:5222 Exception: null

10-23 19:48:50.885 I/System.out(15248): This is what I am looking for end

*******************异常记录结束*************************** **

因此,这基本上意味着它无法识别聊天服务器,但它已启动并正在运行。

我在Ejabberd服务器中需要做任何设置吗? 相当困惑。 PLS。 帮我。

我用来获取异常的代码是

System.out.println("This is what I am looking for beginning");
            Log.e("ERROR", "ConnectionException", e);
            for (int i = 0; i < e.getFailedAddresses().size(); i++) {
                HostAddress element = e.getFailedAddresses().get(i);
                Log.e("ERROR", element.getErrorMessage().toString());
            }
            System.out.println("This is what I am looking for end");

**********************编辑*************************

经过进一步调查,我知道connectToXmppServer方法在Runnable中。

Runnable xmppRunnable = new Runnable() {    
        @Override
    public void run() {
        .....
        connectToXmppServer();
        .....               
        }
}

因此,将Runnable更改为这样的线程

Thread xmppRunnable = new Thread(){ 

在此之后,好消息是虽然我无法解决问题(这是用户在几个小时内脱机),但我收到了一个异常,该异常指出该异常为NetworkOnMainThreadException

I/System.out(10663): NOT CONNECTED

I/System.out(10663): TRYING TO CONNECT

I/System.out(10663): SSmackThis is what I am looking for beginning

I/System.out(10663): SSmackYour localized messagenull

I/System.out(10663): SSmackYour Messagenull

E/ERROR   (10663): SConnectionException

E/ERROR   (10663): org.jivesoftware.smack.SmackException$ConnectionException

E/ERROR   (10663):  at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:436)

E/ERROR   (10663):  at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:811)

E/ERROR   (10663):  at org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:396)

E/ERROR   (10663):  at com.connectlinks.service.ChatService.connectToXmppServer(ChatService.java:326)

E/ERROR   (10663):  at com.connectlinks.service.ChatService.access$0(ChatService.java:293)

E/ERROR   (10663):  at com.connectlinks.service.ChatService$3.run(ChatService.java:281)

E/ERROR   (10663):  at android.os.Handler.handleCallback(Handler.java:733)

E/ERROR   (10663):  at android.os.Handler.dispatchMessage(Handler.java:95)

E/ERROR   (10663):  at android.os.Looper.loop(Looper.java:136)

E/ERROR   (10663):  at android.app.ActivityThread.main(ActivityThread.java:5586)

E/ERROR   (10663):  at java.lang.reflect.Method.invokeNative(Native Method)

E/ERROR   (10663):  at java.lang.reflect.Method.invoke(Method.java:515)

E/ERROR   (10663):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)

E/ERROR   (10663):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)

E/ERROR   (10663):  at dalvik.system.NativeStart.main(Native Method)

I/System.out(10663): MYERRORorg.jivesoftware.smack.SmackException$ConnectionException

I/System.out(10663): SThis is what I am looking for middle

E/SSSERROR(10663): android.os.NetworkOnMainThreadException

I/System.out(10663): SSSERROR android.os.NetworkOnMainThreadException

E/SERROR  (10663): 54.XXX.XXX.XXX:5222 Exception: null

I/System.out(10663): SERROR 54.XXX.XXX.XXX:5222 Exception: null

I/System.out(10663): SThis is what I am looking for end

不知道为什么我在单独的线程中运行此异常,为什么会收到此异常。 任何指针对我来说都是非常有用的。 我希望这个SO问题将使面对该问题的所有人受益。

经过长时间的奋斗,这是我的观察,我能够找到解决问题的办法。 欢迎提供有关我的解决方案的任何反馈

编辑保留答案。

我只是将代码从Runnable修改为线程

当连接到聊天服务器的代码在Runnable中时,我收到了android.os.NetworkOnMainThreadException。 由于某种原因,我无法找到NetworkOnMainThreadException的堆栈跟踪。 使用Runnable建立连接时,ConnectionConfiguration带有NetworkOnMainThreadException。

希望这对遇到与我类似问题的人有所帮助。 我衷心感谢@Flow为帮助我解决此问题所做的努力。 您的出色工作值得称赞,这对android社区是一种祝福。

有关异常,请参见附件中的图像。 在此处输入图片说明

最好在代码中使用AsyncTask进行连接而不是使用Thread。不建议在Android中使用Thread.Try AsyncTask,它用于与连接相关的所有目的。

class ConnectServer extends AsyncTask<Void, Void, XMPPConnection> {

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM