2012-10-11 71 views
0

我正在使用名爲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(...),則會再次創建實例。

回答

1

,這是一個典型的單例模式http://en.wikipedia.org/wiki/Singleton_pattern

public class PeerManager{ 

     // Instance 
     private static PeerManager me; 

     // Private constructor 
     private PeerManager(){} 

     // Access 
     public PeerManager get(){ 
      if(me==null) me = new PeerManager(); 
      return me; 
     } 

     // the rest of your implementation 
    } 

我希望這是有道理的。 這樣你保證你總是隻有一個對象,並且總是被實例化。

+0

FYI,Singleton =只有一個對象的實例。 – wseme

+0

我試圖保存的對象是SimplePeer,PeerManager只是我創建的用於存儲SimplePeer實例的額外類。那仍然是實施?我試圖將我在鏈接中看到的單例模式應用到我的SimplePeer類,但它也不起作用。我編輯了主帖,告訴你我做了什麼。 –