推送使用的是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);將判斷是否已經鏈接服務器置空。這樣程序就會自動從新去鏈接服務器,成功創建新的會話。