首页 > 解决方案 > 在 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);
                }
            });
        }
    };

标签: androidandroid-fragmentssocket.ioandroid-serviceforeground-service

解决方案


似乎 getActivity() 会返回一个空对象,因为该活动不再可见。

您可以使用与主 UI 线程关联的处理程序:

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {...);

我仍然认为那里不需要 UI 线程,只需调用普通线程即可。


推荐阅读