2015-01-26 198 views
0

我連接XMPP服務器使用線程,但我很好奇一個的事兒。我這個代碼onResume方法連接:Android的線程管理

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(); 

然後,如果用戶暫停該應用程序我與此斷開在

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 2015-01-26 19:18:14

0

我想使用AsyncTask是非常有效的方式來做這種東西,而不是手動創建線程。 AsyncTask永遠不會阻塞UI線程,並且更安全。

+0

如果android操作系統殺死我的asynctask,我該怎麼辦? – Okan 2015-01-26 19:23:44

+0

異步任務與線程相同。它更有用,因爲它有更多的方法,但實質上它只是另一個線程。 – sagits 2015-01-26 19:38:59