我正在使用名为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类,但它也不起作用。我编辑了主帖,告诉你我做了什么。 –