我正在使用一个名为 Sip2Peer 的库来实现一个基本的 P2P 系统。每个设备都是一个 Peer,需要在某处存储一个 SimplePeer 类的实例。该对象用于发送消息。
我需要从一个活动和两个广播接收器访问这个对象。我想将它存储在应用程序类中,但由于在 BroadcastReceivers (getApplicationContext) 中检索到的应用程序实例与在活动中检索到的应用程序实例不同,我无法使用它。
然后我决定创建一个名为 PeerManager 的类,将这个 SimplePeer 存储为一个静态对象,但是当我尝试从 BroadcastReceivers 访问它时,SimplePeer 为空。
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”消息再次显示,它不应该。这是为什么?难道我做错了什么?
- - - - - - - - - 编辑 - - - - - - - - - - - - - - -
我试图将单例模式应用于我的 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(...) ,则会再次创建实例。