0

我正在使用一个名为 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(...) ,则会再次创建实例。

4

1 回答 1

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
    }

我希望这是有道理的。这样你就可以保证你总是只有一个对象并且总是被实例化。

于 2012-10-11T14:04:00.533 回答