2

我的应用程序使用 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;
}
4

1 回答 1

0

创建静态套接字并将其连接到您的片段所在的父活动中。之后,当您的片段通过 emit 方法创建订阅时。并在父活动的 onStop 方法中关闭套接字。按照这些说明使其工作。

于 2018-01-03T06:38:03.053 回答