package com.zhangke.websocket;
import android.Manifest;
import android.content.Context;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import com.zhangke.websocket.dispatcher.ResponseProcessEngine;
import com.zhangke.websocket.util.LogImpl;
import com.zhangke.websocket.util.LogUtil;
import com.zhangke.websocket.util.Logable;
import com.zhangke.websocket.util.PermissionUtil;
import java.util.HashMap;
import java.util.Map;
/**
* WebSocket 用户控制句柄
*
* Created by ZhangKe on 2018/12/29.
*/
public class WebSocketHandler {
private final static String TAG = "WebSocketHandler";
/**
* 消息发送引擎
*/
private static WebSocketEngine webSocketEngine;
/**
* 消息处理引擎
*/
private static ResponseProcessEngine responseProcessEngine;
/**
* 默认的 WebSocket 连接
*/
private static WebSocketManager defaultWebSocket;
/**
* 对 {@link #mWebSocketMap} 操作时的锁
*/
private static final Object WS_MAP_BLOCK = new HashMap<>();
/**
* 通过 Map 存储 WSM 对象,以此支持多个连接
*/
private static Map mWebSocketMap;
private static Logable mLog;
/**
* 初始化默认的 WebSocket 连接
*
* @param setting 该连接的相关设置参数
*/
public static WebSocketManager init(WebSocketSetting setting) {
if (defaultWebSocket == null) {
synchronized (WebSocketHandler.class) {
if (webSocketEngine == null) {
webSocketEngine = new WebSocketEngine();
}
if (responseProcessEngine == null) {
responseProcessEngine = new ResponseProcessEngine();
}
if (defaultWebSocket == null) {
defaultWebSocket = new WebSocketManager(setting,
webSocketEngine,
responseProcessEngine);
}
}
} else {
LogUtil.e(TAG, "Default WebSocketManager exists!do not start again!");
}
return defaultWebSocket;
}
/**
* 通过唯一标识符新建一个 WebSocket 连接
*
* @param key 该 WebSocketManager 的唯一标识符,
* 后面需要通过这个 key 来获取到对应的 WebSocketManager
* @param setting 该连接的相关设置参数
*/
public static WebSocketManager initGeneralWebSocket(String key, WebSocketSetting setting) {
checkEngineNullAndInit();
checkWebSocketMapNullAndInit();
synchronized (WS_MAP_BLOCK) {
if (mWebSocketMap.containsKey(key)) {
LogUtil.e(TAG, "WebSocketManager exists!do not start again!");
return mWebSocketMap.get(key);
} else {
WebSocketManager wsm = new WebSocketManager(setting,
webSocketEngine,
responseProcessEngine);
mWebSocketMap.put(key, wsm);
return wsm;
}
}
}
/**
* 获取默认的 WebSocket 连接,
* 调用此方法之前需要先调用 {@link #init(WebSocketSetting)} 方法初始化
*
* @return 返回一个 {@link WebSocketManager} 实例
*/
public static WebSocketManager getDefault() {
return defaultWebSocket;
}
/**
* 获取 WebSocketManager 对象
*
* @param key 该 WebSocketManager 的 key
* @return 可能为空,代表该 WebSocketManager 对象不存在或已移除
*/
public static WebSocketManager getWebSocket(String key) {
checkWebSocketMapNullAndInit();
if (mWebSocketMap.containsKey(key)) {
return mWebSocketMap.get(key);
} else {
return null;
}
}
/**
* 获取所有 WebSocketManager(defaultWebSocketManager 除外)
*/
public static Map getAllWebSocket() {
checkWebSocketMapNullAndInit();
return mWebSocketMap;
}
/**
* 移除一个 WebSocketManager 对象
*
* @param key 该 WebSocketManager 的 key
* @return 返回移除的 WebSocketManager,可能为空
*/
public static WebSocketManager removeWebSocket(String key) {
checkWebSocketMapNullAndInit();
if (mWebSocketMap.containsKey(key)) {
WebSocketManager removed = mWebSocketMap.get(key);
synchronized (WS_MAP_BLOCK) {
mWebSocketMap.remove(key);
}
return removed;
} else {
return null;
}
}
/**
* 注册网络变化监听广播,网络由不可用变为可用时会重新连接 WebSocket
*
* @param context 此处应该使用 ApplicationContext,避免内存泄漏以及其它异常。
*/
public static void registerNetworkChangedReceiver(Context context) {
if (PermissionUtil.checkPermission(context, Manifest.permission.ACCESS_NETWORK_STATE)) {
try {
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(new NetworkChangedReceiver(), filter);
} catch (Exception e) {
LogUtil.e(TAG, "网络监听广播注册失败:", e);
}
} else {
LogUtil.e(TAG, "未获取到网络状态权限,广播监听器无法注册");
}
}
/**
* 初始化引擎
*/
private static void checkEngineNullAndInit() {
if (webSocketEngine == null || responseProcessEngine == null) {
synchronized (WebSocketHandler.class) {
if (webSocketEngine == null) {
webSocketEngine = new WebSocketEngine();
}
if (responseProcessEngine == null) {
responseProcessEngine = new ResponseProcessEngine();
}
}
}
}
/**
* 初始化 mWebSocketMap
*/
private static void checkWebSocketMapNullAndInit() {
if (mWebSocketMap == null) {
synchronized (WS_MAP_BLOCK) {
if (mWebSocketMap == null) {
mWebSocketMap = new HashMap<>();
}
}
}
}
/**
* 设置打印日志实现类,设置完成后内部运行日志会通过设置的实现类打印。
* 需实现 {@link Logable} 接口
*/
public static void setLogable(Logable logable) {
mLog = logable;
}
public static Logable getLogable() {
if (mLog == null) {
mLog = new LogImpl();
}
return mLog;
}
}