【发布时间】:2018-02-19 10:21:15
【问题描述】:
我正在开发一个使用socket.io java client 的android/ios 应用游戏,以及一个也使用socket.io 的node.js 后端。在 ios 应用程序上,一切正常,但我的分析工具告诉我,在 android 中有很多用户面临致命异常。这里是:
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at io.socket.client.Socket.onevent(Unknown Source)
at io.socket.client.Socket.connect(Unknown Source)
at io.socket.client.Socket.open(Unknown Source)
at io.socket.client.Socket$2$2.call(Unknown Source)
at io.socket.emitter.Emitter.on(Unknown Source)
at io.socket.client.Manager.emitAll(Unknown Source)
at io.socket.client.Manager.reconnection(Unknown Source)
at io.socket.client.Manager$7.call(Unknown Source)
at io.socket.emitter.Emitter.on(Unknown Source)
at io.socket.parser.Parser$Decoder.add(Unknown Source)
at io.socket.client.Manager.emitAll(Unknown Source)
at io.socket.client.Manager.reconnection(Unknown Source)
at io.socket.client.Manager$2.call(Unknown Source)
at io.socket.emitter.Emitter.on(Unknown Source)
at io.socket.engineio.client.Socket.open(Unknown Source)
at io.socket.engineio.client.Socket.open(Unknown Source)
at io.socket.engineio.client.Socket$5.call(Unknown Source)
at io.socket.emitter.Emitter.on(Unknown Source)
at io.socket.engineio.client.Transport.onError(Unknown Source)
at io.socket.engineio.client.transports.Polling.pause(Unknown Source)
at io.socket.engineio.client.transports.Polling$2.call(Unknown Source)
at io.socket.engineio.parser.Parser.encodePacket(Unknown Source)
at io.socket.engineio.client.transports.Polling.pause(Unknown Source)
at io.socket.engineio.client.transports.Polling.pause(Unknown Source)
at io.socket.engineio.client.transports.PollingXHR$5$1.run(Unknown Source)
at io.socket.thread.EventThread$2.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:762)
我在 node.js 后端使用 1.7.4 版,socket.io java client 的 0.9.0 版。我尝试了很多方法来摆脱这个异常,但似乎没有什么比在单例或服务中使用这个库更有效。
有没有人也面临这个问题?
如果您需要更多项目代码示例或想查看应用程序(在商店中),请告诉我。
这是来自 android 应用程序的示例代码:
公共类 SocketManager { 私有静态 SocketManager 实例; 私有 Socket 套接字; 公共静态 SocketManager getInstance() { if (instance == null) instance = new SocketManager(); 返回实例; } 私人 SocketManager() { 尝试 { IO.Options 选项 = 新 IO.Options(); options.forceNew = true; socket = IO.socket(ApiConstants.Routes.URL, 选项); socket.on(Socket.EVENT_CONNECT, (dataArray) -> { Log.e("SocketManager", "已连接"); JSONArray 数组 = 新 JSONArray(); array.put(Prefs.getAuthToken()); array.put(Prefs.getGroupId()); socket.emit("updateUserSocket", 数组); }); socket.on(Socket.EVENT_DISCONNECT, (dataArray) -> { Log.e("SocketManager", "断开连接"); }); socket.on(Socket.EVENT_RECONNECT, (dataArray) -> { Log.e("SocketManager", "重新连接"); }); socket.on(Socket.EVENT_ERROR, (dataArray) -> { Log.e("SocketManager", "error"); }); socket.on(Constants.SocketEvents.USER_UPDATED, (dataArray) -> { Log.e("SocketManager", "用户更新"); sendBroadcast(Constants.SocketEvents.USER_UPDATED); }); socket.on(Constants.SocketEvents.USER_SELF_REMOVED, (dataArray) -> { Log.e("SocketManager", "用户自行删除"); sendBroadcast(Constants.SocketEvents.USER_SELF_REMOVED); }); socket.on(Constants.SocketEvents.START_GAME, (dataArray) -> { Log.e("SocketManager", "开始游戏"); sendBroadcast(Constants.SocketEvents.START_GAME); }); socket.on(Constants.SocketEvents.START_VOTING, (dataArray) -> { Log.e("SocketManager", "开始投票"); sendBroadcast(Constants.SocketEvents.START_VOTING); }); socket.on(Constants.SocketEvents.GROUP_DELETED, (dataArray) -> { Log.e("SocketManager", "组已删除"); sendBroadcast(Constants.SocketEvents.GROUP_DELETED); }); socket.on(Constants.SocketEvents.UPDATE_GROUP, (dataArray) -> { Log.e("SocketManager", "更新组"); sendBroadcast(Constants.SocketEvents.UPDATE_GROUP); }); socket.on(Constants.SocketEvents.GAME_P1, (dataArray) -> { Log.e("SocketManager", "game p1"); sendBroadcast(Constants.SocketEvents.GAME_P1); }); socket.on(Constants.SocketEvents.GAME_P2, (dataArray) -> { Log.e("SocketManager", "game p2"); sendBroadcast(Constants.SocketEvents.GAME_P2); }); socket.on(Constants.SocketEvents.GAME_P3, (dataArray) -> { Log.e("SocketManager", "game p3"); sendBroadcast(Constants.SocketEvents.GAME_P3); }); socket.on(Constants.SocketEvents.GAME_P4, (dataArray) -> { Log.e("SocketManager", "game p4"); sendBroadcast(Constants.SocketEvents.GAME_P4); }); } 捕捉(URISyntaxException e){ e.printStackTrace(); } } 私人无效发送广播(字符串事件){ 意图意图 = 新意图(事件); LocalBroadcastManager.getInstance(MyApp.getContext()).sendBroadcast(intent); } 公共无效连接(){ 如果(套接字!= null){ socket.connect(); } } 公共无效断开(){ 如果(套接字!= null){ socket.disconnect(); } } }【问题讨论】:
-
安卓应用是原生的吗?
-
Jep,全本地人
-
能否分享一下代码,此时显示异常
-
看起来异常来自库本身。但我会更新我的问题,向您展示我在我的 android 应用程序中用于 socket.io 的代码。
-
在 io.socket.client.Socket.onevent(Unknown Source) 可能有一个参数是未知的。