기본 P2P 시스템을 구현하기 위해 Sip2Peer라는 라이브러리를 사용하고 있습니다. 각 장치는 Peer이며 SimplePeer 클래스의 인스턴스를 어딘가에 저장해야합니다. 이 객체는 메시지를 보내는 데 사용됩니다.Android : 객체 저장 위치
활동 및 두 개의 BroadcastReceivers에서이 개체에 액세스해야합니다. 응용 프로그램 클래스에 저장하고 싶었지만 BroadcastReceivers (getApplicationContext)에서 검색 한 응용 프로그램 인스턴스가 해당 응용 프로그램 인스턴스에서 검색된 인스턴스와 같지 않아 사용하지 못했습니다.
그런 다음이 SimplePeer를 정적 객체로 저장하는 PeerManager라는 클래스를 만들려고했지만 BroadcastReceivers에서 액세스하려고하면 SimplePeer가 null입니다.
PeerManager 클래스 : 내 활동과 처음에 두 번이 코드를 실행
if(PeerManager.getPeer()==null){
Log.d("AA", "New Peer");
PeerManager.createPeer(mContext, username);
}
else{
PeerManager.getPeer().logInfo();
PeerManager.getPeer().joinToPeer(PeerManager.getPeer().getBootstrapPeerAddress());
}
:
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();
}
}
은}
이것은 내가 내 활동 및 브로드 캐스트 리시버에 액세스하는 방법입니다 "새 피어"메시지가 표시되고 다음 메시지는 표시되지 않습니다. 그러나 그 후, 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;
}
...
} 이전과
결과는 동일합니다 : 내 활동에 SimplePeer.getInstance (...)를 사용하는 경우 인스턴스가 처음 생성되지만 두 번째 이것은 클래스 시간은 그렇지 않습니다. BroadcastReceiver에서 SimplePeer.getInstance (...)를 사용하면 인스턴스가 다시 생성됩니다. 고전적인 싱글 톤 패턴 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
}
내가 말이 희망을이다
FYI, Singleton = 객체의 단 하나의 인스턴스. – wseme
저장하려고하는 객체는 SimplePeer이고, PeerManager는 SimplePeer 인스턴스를 저장하기 위해 만든 추가 클래스입니다. 여전히 구현입니까? 나는 내 SimplePeer 클래스에 대한 링크에서 본 싱글 톤 패턴을 적용하려고 시도했지만 작동하지 않습니다. 내가 한 일을 보여주기 위해 메인 포스트를 편집했다. –