我使用名为Sip2Peer的库来实现基本的P2P系统。每个设备都是Peer,需要在某处存储SimplePeer类的实例。该对象用于发送消息。
我需要从一个活动和两个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();
}
}
}
这是我在Activity和BroadcastReceivers中访问它的方式:
if(PeerManager.getPeer()==null){
Log.d("AA", "New Peer");
PeerManager.createPeer(mContext, username);
}
else{
PeerManager.getPeer().logInfo();
PeerManager.getPeer().joinToPeer(PeerManager.getPeer().getBootstrapPeerAddress());
}
我在我的Activity中执行了两次这个代码,第一次是" New Peer"显示消息,下一个消息不是。但在那之后,当我的BroadcastReceiver被执行时," New Peer"消息再次显示,它不应该。这是为什么?我做错了吗?
----------------- EDIT ----------------------------- -
我尝试将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;
}
...
}
结果和以前一样:当我在Activity中使用SimplePeer.getInstance(...)时,第一次创建实例,但第二次不是。如果那时我在BroadcastReceiver中使用SimplePeer.getInstance(...),则会再次创建实例。
答案 0 :(得分: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
}
我希望这是有道理的。 这样你就可以保证你总是只有一个对象并且总是被实例化。