android聊天程序 xmpp-asmack,Java-Android XMPP连接不是持久性的-asmack库甚至...

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

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

但我得到以下异常

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问题将使面对该问题的所有人受益.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值