Android:存储对象的位置

时间:2012-10-11 13:54:50

标签: android object singleton p2p

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

1 个答案:

答案 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
    }

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