2015-01-26 2 views
0

내가 스레드를 사용하여 XMPP 서버를 연결하고 있지만, 내가 한 건에 대해서 호기심이 onResume 방법이 코드와 연결하고 오전 :안드로이드 스레드 관리

사용자가 내가 이것으로 분리하고 응용 프로그램을 일시 정지하는 경우 다음
Thread t=new Thread(new Runnable() { 
     @Override 
     public void run() { 
      ConnectionConfiguration connConfig=new ConnectionConfiguration("SERVER IP", 5222,"localhost"); 
      XMPPConnection connection=new XMPPTCPConnection(connConfig); 
      connection.connect(); 
     } 
    }); 
    t.start(); 

그래서 onPause

Thread t=new Thread(new Runnable() { 

    @Override 
    public void run() { 
      connection.disconnect(); 
    } 
}); 
t.start(); 

코드, 나는이 좋은 방법 각각의 홈 버튼 press.Is에 새 스레드를 만드는 오전? 어쩌면 메모리 누출의 원인이 될지 모르겠다. 이 작업을 위해 무엇을 제안합니까?

답변

1

저는 XMPP가 아닌 비슷한 일을했습니다.하지만 소켓이 작동했습니다. XMPPConnection에 대한 Static 클래스를 만들어 하나의 (그리고 같은) 연결로 항상 작업해야합니다. 소켓을 사용할 때 객체에서 연결이 닫히지 않았지만 네트워크 레이어에서 여전히 활성 상태라는 것을 알았으며 이중 메시지 (동시에 두 개의 연결)가 있습니다.

public class XMPPChatSingleton { 

public static XMPPChatSingleton instance; 
private XMPPConnection xmpp; 
private Activity activity; 
ProgressDialog pdialog; 
int timeOut; 

public static XMPPChatSingleton getInstance(Activity activity, boolean reconnect) { 

    if (instance == null || reconnect) { 
     instance = getSync(activity, event); 
    } 

    return instance; 
} 

public static synchronized XMPPChatSingleton getSync(Activity activity, Event event) { 
    instance = new XMPPChatSingleton (activity, event); 

    return instance; 
} 

public XMPPConnection getSocket() { 
    return this.socket; 
} 

private XMPPChatSingleton (Activity activity, Event event) { 
    this.activity = activity; 
    this.context = activity.getApplicationContext(); 
    this.event = event; 
    this.xmpp = getChatXMPP(); 
} 

private getChatXMPP() { 

    dialogLoad(); 
    xmpp = new XMPPConnection(); 
    // here you can handle your connection too; 
    // use timeout to handle reconnection 

} 

    public void disconnect() { 

    xmpp.disconnect; 
    } 


} 

이 접근법의 장점은 모든 활동과 단편에서 동일한 연결을 재사용 할 수 있다는 것입니다. 메시지 보내기를 처리 할 메소드를 작성할 수도 있습니다. 메시지가 도착하면 다시 전달하고 어댑터를 전달하고 모든 종류의 물건을 보내십시오.

여기에서 서버로부터 모든 데이터를 보내고 context.sendBroadcast (dataYouWantToPass)를 사용하여 현재 활성화 된 액티비티 또는 조각으로 전달하는 것이 좋습니다.

+0

수업에 대한 간단한 예를 들려 줄 수 있습니까? – Okan

0

AsyncTask를 사용하면 수동으로 스레드를 만드는 대신 이러한 종류의 작업을 수행하는 것이 훨씬 효율적이라고 생각합니다. AsyncTask는 UI 스레드를 차단하지 않으며 훨씬 안전합니다.

+0

안드로이드 OS가 내 asynctask를 죽이는 경우 어떻게해야합니까? – Okan

+0

비동기 작업은 스레드와 같은 방식으로 진행됩니다. 더 많은 메소드를 가지고 있기 때문에 더 유용하지만, 실제로는 또 다른 스레드입니다. – sagits