由于项目需求,跟.Net服务器有长链接,最终选择用SignalA来做,在Github上找了一圈,最终选用 https://github.com/erizet/SignalA 集成到自己的项目里。
在集成SignalA项目过程中, 使用创建一个Service来开启SignalA服务,但是出现了一个问题,当网络空闲的时候,Json字符串为null的时候,没有补获string = null 的异常。去GitHub上issue上查看,也有遇到这个问题。坑爹的是,代码已经提交修复了这个Bug,但是作者没有更新版本。
两个解决方案:
1.将源码clone下来,自己改,再放到自己的工程,不直接使用依赖。
2.就是我采用的方案,为了不集成源码,我写了一个工具类SignalAUtils。在使用的时候才去调用,不用的时候就断开连接
上源码:
SignalAUtils.hubConnection = new HubConnection(SignalAUtils.getHubUrl(),MeasurePointActivity.this,new LongPollingTransport()){ @Override public void OnError(Exception exception) { Log.v("",""); } @Override public void OnMessage(String message){ Log.v("",""); } @Override public void OnStateChanged(StateBase oldState, StateBase newState) { switch (newState.getState()) { case Disconnected: break; case Connecting: break; case Connected:{ // 调用方法 DHParseUtils.setId(1); DHParseUtils.sendTrendData(mListDatas); DHParseUtils.DealNetData(); ReceiveData(); } break; case Reconnecting: Log.v("",""); break; case Disconnecting: Log.v("",""); break; } } }; SignalAUtils.init(); SignalAUtils.Connect();
当你不用的时候调用
SignalAUtils.DisConnect();
下面是SignalAUtils的源码
public class SignalAUtils { private final static String TAG = SignalAService.class.getSimpleName();; private static String HUB_URL = DHURLUtils.GetRendAtlasUrl(); private static Context mContext ; public static HubConnection hubConnection = null; /* * hub代理 panderman 2013-10-25 */ public static IHubProxy hub = null; /** * 开启推送服务 panderman 2013-10-25 */ public static void init() { try { //服务器端的HUB为ChatHub hub = hubConnection.CreateHubProxy("GraphRealDataHub"); } catch (OperationApplicationException e) { e.printStackTrace(); } } // 连接 public static void Connect(){ if (hubConnection == null) return; hubConnection.Start(); } // 断开连接 public static void DisConnect(){ if (hubConnection == null) return; hubConnection.Stop(); hubConnection = null; } public static void postParams(String params,String methodName){ if (hub == null) return; List<String> paramsList = new ArrayList<>(); paramsList.add(params); hub.Invoke(methodName,paramsList, new HubInvokeCallback() { @Override public void OnResult(boolean succeeded, String response) { Log.v(TAG, response); } @Override public void OnError(Exception ex) { Log.v(TAG,"error"); } }); } public static String getHubUrl() { return HUB_URL; } public static void setHubUrl(String hubUrl) { HUB_URL = hubUrl; } public static Context getmContext() { return mContext; } public static void setmContext(Context mContext) { SignalAUtils.mContext = mContext; } }经过测试,可以暂时规避问题,但是治标不治本啊!