2012-10-11 2 views
0

기본 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 
    } 

내가 말이 희망을이다

답변

1

. 그런 식으로 항상 하나의 객체 만 있고 항상 인스턴스화된다는 것을 보장합니다.

+0

FYI, Singleton = 객체의 단 하나의 인스턴스. – wseme

+0

저장하려고하는 객체는 SimplePeer이고, PeerManager는 SimplePeer 인스턴스를 저장하기 위해 만든 추가 클래스입니다. 여전히 구현입니까? 나는 내 SimplePeer 클래스에 대한 링크에서 본 싱글 톤 패턴을 적용하려고 시도했지만 작동하지 않습니다. 내가 한 일을 보여주기 위해 메인 포스트를 편집했다. –