0

基本的な P2P システムを実装するために、Sip2Peer という名前のライブラリを使用しています。各デバイスはピアであり、SimplePeer クラスのインスタンスをどこかに格納する必要があります。このオブジェクトは、メッセージの送信に使用されます。

アクティビティと 2 つの BroadcastReceiver からこのオブジェクトにアクセスする必要があります。アプリケーション クラスに格納したかったのですが、BroadcastReceivers (getApplicationContext) で取得したアプリケーション インスタンスとアクティビティで取得したアプリケーション インスタンスが異なるため、使用できませんでした。

次に、この SimplePeer を静的オブジェクトとして格納する PeerManager という名前のクラスを作成することにしましたが、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());
        }

アクティビティでこのコードを 2 回実行しましたが、最初に "New Peer" メッセージが表示され、次のメッセージは表示されません。しかし、その後、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(...) を使用すると、最初はインスタンスが作成されますが、2 回目は作成されません。次に、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
    }

それが理にかなっていることを願っています。こうすることで、常に 1 つのオブジェクトのみを持ち、常にインスタンス化されることが保証されます。

于 2012-10-11T14:04:00.533 に答える