推送使用的是androidpn,当Server晚于Client启动或者Client链接后,Server重启,会出现Client没法再链接的状况。分析是由于Client的链接时,对队列的管理有些问题,
private void addTask(Runnable runnable) {
Log.d("addTask(runnable)...");
taskTracker.increase();
synchronized (taskList) {
if (taskList.isEmpty() && !running) {
running = true;
futureTask = taskSubmitter.submit(runnable);
if (futureTask == null) {
taskTracker.decrease();
}
} else {
runTask();
taskList.add(runnable);
}
}
Log.d("addTask(runnable)... done");
}
当链接不上服务器时候抛出异常,致使任务列表一直处于被添加而没有执行,须要在esle里面手动跑起链接线程。
若是当以前pn链接成功,服务器重启,那么须要在服务器断开,捕捉到登陆失败异常的时候
} catch (XMPPException e) {
xmppManager.setConnection(null);
Log.e("LoginTask.run()... xmpp error");
Log.e("Failed to login to xmpp server. Caused by: " + e.getMessage());
e.printStackTrace();
String INVALID_CREDENTIALS_ERROR_CODE = "401";
String errorMessage = e.getMessage();
if (errorMessage != null && errorMessage.contains(INVALID_CREDENTIALS_ERROR_CODE)) {
xmppManager.reregisterAccount();
return;
}
xmppManager.startReconnectionThread();
}
执行xmppManager.setConnection(null);将判断是否已经链接服务器置空。这样程序就会自动从新去链接服务器,成功创建新的会话。