我正在使用名爲Sip2Peer的庫來實現基本的P2P系統。每個設備都是一個Peer,並且需要有一個SimplePeer類的實例存儲在某個地方。該對象用於發送消息。Android:在哪裏存儲對象
我需要從活動和兩個BroadcastReceivers訪問此對象。我想將它存儲在應用程序類中,但由於在BroadcastReceivers(getApplicationContext)中檢索到的應用程序實例與活動中檢索到的應用程序實例不同,所以我無法使用它。
然後我決定創建一個名爲PeerManager的類,該類將此SimplePeer存儲爲靜態對象,但是當我嘗試從BroadcastReceivers訪問它時,SimplePeer爲null。
PeerManager類:
public class PeerManager {
private static SimplePeer peer = null;
public static SimplePeer getPeer() {
return PeerManager.peer;
}
public static void setPeer(SimplePeer peer) {
PeerManager.peer = peer;
}
public static void createPeer(Context context, String username) {
try{
PeerManager.peer = new SimplePeer(...);
...
}catch(Exception e){
e.printStackTrace();
}
}
}
這是我訪問它在我的活動和BroadcastReceivers:
if(PeerManager.getPeer()==null){
Log.d("AA", "New Peer");
PeerManager.createPeer(mContext, username);
}
else{
PeerManager.getPeer().logInfo();
PeerManager.getPeer().joinToPeer(PeerManager.getPeer().getBootstrapPeerAddress());
}
我在我的活動,並在第一時間執行該代碼兩次顯示「新對等」消息,下一個不是。但在此之後,當我的BroadcastReceiver執行時,「新對等」消息再次顯示,而不應該顯示。這是爲什麼?難道我做錯了什麼?
-----------------編輯---------------------------- -
我試圖將Singleton模式應用於我的SimplePeer類。這是類:
public class SimplePeer extends Peer {
private Context mContext;
private static SimplePeer instance = null;
public SimplePeer(String pathConfig, String key, Context context) {
super(pathConfig, key);
this.mContext = context;
}
public static SimplePeer getInstance(String pathConfig, String key, Context context){
if(instance==null){
Log.d("SIMPLE PEER", "New instance");
instance = new SimplePeer(pathConfig, key, context);
instance.contactSBC();
}
return instance;
}
...
}
結果是和以前一樣:當我在活動中使用SimplePeer.getInstance(...)的實例被創建的第一次,但第二次時間不是。如果我在我的BroadcastReceiver中使用SimplePeer.getInstance(...),則會再次創建實例。
FYI,Singleton =只有一個對象的實例。 – wseme
我試圖保存的對象是SimplePeer,PeerManager只是我創建的用於存儲SimplePeer實例的額外類。那仍然是實施?我試圖將我在鏈接中看到的單例模式應用到我的SimplePeer類,但它也不起作用。我編輯了主帖,告訴你我做了什麼。 –