基本的な 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(...) を使用すると、インスタンスが再度作成されます。