android - 在 socket.io 聊天中收到消息时的前台服务问题
问题描述
应用程序使用前台服务运行并且设备保持连接,但是当从其他客户端发送消息时,应用程序不幸停止了。我得到了那个错误:
E/AndroidRuntime: FATAL EXCEPTION: EventThread
Process: com.github.nkzawa.socketio.androidchat, PID: 6693
java.lang.NullPointerException: Attempt to invoke virtual method
'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)'
on a null object reference
at com.github.nkzawa.socketio.androidchat.MainFragment$6.call(MainFragment.java:339)
这是我的 Fragment 类中的代码,logcat 给了我导致错误的原因。
private Emitter.Listener onNewMessage = new Emitter.Listener() {
@Override
public void call(final Object... args) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject data = (JSONObject) args[0];
String username;
String message;
try {
username = data.getString("username");
message = data.getString("message");
} catch (JSONException e) {
Log.e(TAG, e.getMessage());
return;
}
removeTyping(username);
addMessage(username, message);
setNotificationMessage(message, username);
}
});
}
};
解决方案
似乎 getActivity() 会返回一个空对象,因为该活动不再可见。
您可以使用与主 UI 线程关联的处理程序:
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {...);
我仍然认为那里不需要 UI 线程,只需调用普通线程即可。
推荐阅读
- c - Switch Case 中的 Switch Case - 是否使用跌落式机箱,然后使用相同跌落式的新 Switch Case,这是一种糟糕的设计理念?
- javascript - 防止内容注入到 HTTP 请求标头中
- bash - 在后台运行 tcpdump linux
- python - 如何在带有熊猫的数据框中添加索引和单位引用?
- encryption - 禁用弱 TLS 密码套件
- javascript - 如何用其他组件替换部分组件?
- azure - 未收到 Microsoft Graph 更改通知
- python - 如何通过网页与 Python 脚本交互?
- javascript - 如何在材质 UI 中的字段之间留出空间?
- c# - 为什么我通过 HttpClient 调用 API 会出现服务器超时但 Postman 很好?