2012-10-11 54 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类,但它也不起作用。我编辑了主帖,告诉你我做了什么。 –