我的应用程序使用 Koush 的 web-sockets/Socket.IO 库仅用于一个片段。(https://github.com/koush/android-websockets)
我在让 Socket.IO 客户端与片段生命周期及其线程正常工作时遇到一些问题。
在大多数情况下,我的片段如下所示:
public class ScoresFragment extends SherlockFragment {
public SocketIOClient socket;
@Override
public void onCreate(Bundle savedInstanceState) {
createSocket();
super.onCreate(savedInstanceState);
}
@Override
public void onPause() {
try {
this.socket.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
super.onPause();
}
@Override
public void onResume() {
socket.connect();
super.onResume();
}
public void createSocket() {
this.socket = new SocketIOClient(URI.create("http://blah-url"), new SocketIOClient.Handler() {
//Required methods here
}
}
@Override
public void onCreateView(LayoutInflater inflater, ViewGroup group, Bundle savedInstanceState) {
//Everything for the layout here
}
}
当我尝试断开套接字时,我得到的错误出现在 onPause() 方法中。套接字连接得很好,但是一旦我更改片段,我就会崩溃。
致命例外:主要 java.lang.NullPointerException 在 com.codebutler.android_websockets.SocketIOClient.cleanup(SocketIOClient.java:195) 在 com.codebutler.android_websockets.SocketIOClient.disconnect(SocketIOClient.java:188) 在 edu.bgsu.asf.athletics.fragments.ScoresFragment.onPause(ScoresFragment.java:14)
我在某处读到我可能不得不对线程保持警惕,并且我可能不得不为此使用处理程序,但是 web-sockets 的 git 页面并没有暗示必须使用类似的东西。提前致谢。
编辑:
SocketIOClient.java 的部分:
public void disconnect() throws IOException {
cleanup(); //Line 188
}
/////////////////////////////////////////////
private void cleanup() {
mClient.disconnect();
mClient = null;
mSendLooper.quit(); //Line 195
mSendLooper = null;
mSendHandler = null;
}