Koush の web-sockets/Socket.IO ライブラリを 1 つのフラグメントに使用しているアプリケーションがあります。(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 ソケットの 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;
}