2013-01-16 1 views
2

저는 Koush의 웹 소켓/Socket.IO 라이브러리를 단 하나의 조각에만 사용하고 있습니다. (https://github.com/koush/android-websockets)파편이있는 Android Socket.IO

Skeet.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() 메소드에 : 대부분의 경우

, 나의 조각은 다음과 같습니다. 소켓은 잘 연결되지만 조각을 변경하자마자 충돌이 발생합니다.

 
FATAL EXCEPTION: main 
java.lang.NullPointerException 
    at com.codebutler.android_websockets.SocketIOClient.cleanup(SocketIOClient.java:195) 
    at com.codebutler.android_websockets.SocketIOClient.disconnect(SocketIOClient.java:188) 
    at edu.bgsu.asf.athletics.fragments.ScoresFragment.onPause(ScoresFragment.java:14) 

은 내가 스레드 조심해야 어딘가에 읽고 나는 이것에 대한 핸들러를 사용 할 수 있지만, 웹 소켓의 자식 페이지는 같은 것을 사용하는 데 암시하지 않습니다. 미리 감사드립니다.

편집 : 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; 
} 

답변

0

정적 소켓을 만들고 부모 활동에 연결하는 당신의 조각 거짓말이다. 그 후 당신의 프래그먼트가 emit 메소드를 통해 subscribe를 생성 할 때. 부모 작업의 onStop 메소드에서 소켓을 닫습니다. 다음 지침에 따라 작동 시키십시오.