공부/Android

socket.io 사용할때 뒤로가기 눌렀을때 앱 종료되는 이유?

데자와 맛있다 2022. 11. 7. 01:23

결론부터 말하면 disconnect 이벤트와 소켓 연결 해지(.disconnect())가 둘다 있을때 null exception에러 발생가능함! 이것이 문제인지 한번 확인해보세요!!

 

사실.. socket.io client 공식문서를 대강봐서  정확하게는 모르겠으나..

앱 뒤로가기를 누르거나 하여간 지금 띄워져있는 view가 onDestory될때 소켓 연결 해지를 하기위해 

@Override
    protected void onDestroy() {
        super.onDestroy();
        socket.emit("disconnected", null);
        socket.disconnect();
    }

요런식으로 emit으로 서버쪽에 disconnected이벤트 일으키고 그담에 안드로이드에서도 disconnect한적이 있는데..

이렇게하면 지금 view가 onDestroy될때 


E/EventThread: Task threw exception
    java.lang.NullPointerException: Attempt to get length of null array
        at io.socket.client.Socket$5.run(Socket.java:192)
        at io.socket.thread.EventThread$2.run(EventThread.java:80)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)
2022-11-07 01:20:00.452 30107-30172/com.example.rvsm E/AndroidRuntime: FATAL EXCEPTION: EventThread
    Process: com.example.rvsm, PID: 30107
    java.lang.NullPointerException: Attempt to get length of null array
        at io.socket.client.Socket$5.run(Socket.java:192)
        at io.socket.thread.EventThread$2.run(EventThread.java:80)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)


위와같은 null exception에러가 발생한다!!!!!!!!!!!

잘 읽어보면 소켓이 null인데 왜 참조하냐!! 이소리임..

하여... 소켓이 이미 사라졌는데 또 참조를 하는 부분이 있나 확인해보니 바로 맨 위에 올린 코드가 문제였다!

 @Override
    protected void onDestroy() {// 소켓연결 해지할때 얘처럼 둘중 하나만하세요!!!!!!!!!!!
        super.onDestroy();
        socket.disconnect();
    }

그래서 소켓 연결을 끊을거면 위와 같이 socket.disconnect()를 하던가 socket.emit("disconnected", null) 로 서버쪽에 연결 해지 요청을 하던가 둘중 하나만 해야 할듯함!

문서를 완전히 안읽어서 정확하지는 않으나.. 실험해본바에 따르면 disconnected이벤트를 서버쪽에 일으키면 자동적으로 소켓이 null로 변하는듯 하다! 

교훈? 공식문서를 잘 읽자! ^^