2011-07-06 2 views
0

이것은 여러 가지 질문 중 하나입니다. 기본적으로 세 탭이있는 탭 응용 프로그램이 있습니다. 각 탭은 웹 서비스 및 Wi-Fi API에 액세스해야합니다. 이 모든 공유 기능에 대해 두 개의 정적 래퍼 클래스를 만들어 세 개의 모든 활동에서 동일한 정적 클래스를 사용할 수 있도록하여이 작업을 단순화하고자합니다.Android asynch static classes?

나는 안드로이드/자바에서 상당히 실용적이어서 여기 몇 가지 포인터를 찾고있다.

예를 들어, 여기에 내 Wi-Fi 클래스가 있습니다. 리스너를 수신하고 수신 할 때마다 검색 결과를 게시하기 만하면됩니다. 가입자가 관심을 갖고 있는지 여부를 결정하는 것은 가입자의 몫입니다.

public final class WifiManagerActivity extends Activity { 

    private static WifiManager _wm; 
    private static List<OnWifiRecievedListener> _listeners; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     _wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
     if (!_wm.isWifiEnabled()) 
      _wm.setWifiEnabled(true); 

     _listeners = new ArrayList<OnWifiRecievedListener>(); 

     IntentFilter i = new IntentFilter(); 
     i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 
     registerReceiver(new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       publishResults(_wm.getScanResults()); 
       _wm.startScan(); 
      } 
     }, i); 
     _wm.startScan(); 
    } 

    private static void publishResults(List<ScanResult> results){ 
     for (int i = 0; i < _listeners.size(); i++) 
      _listeners.get(i).onWifiRecieved(results); 
    } 

    public static void addWifiRecievedListener(OnWifiRecievedListener owrl) { 
     if (!_listeners.contains(owrl)) 
      _listeners.add(owrl); 
    } 

    public static void removeWifiRecievedListener(OnWifiRecievedListener owrl){ 
     if (_listeners.contains(owrl)) 
      _listeners.remove(owrl); 
    } 
} 

유효합니까? 아니면 안드로이드 애플리케이션의 수명을 모르고 있습니까? 내 함정에 어떤 함정이 있니?

또한 WifiManagerActivity가 별도의 스레드에있는 경우 다른 스레드에서 변수를 사용해야하는 메서드를 호출하는 방법은 어떻게 처리됩니까? C#에서는 dispatcher를 사용하여 java/android를 호출합니다.

요약 :

1) 현재 계획에 대한 문제점이나 제안 사항이 있습니까?
2) 한 스레드에서 메서드를 호출하고 다른 스레드에 속한 변수를 변경하려면 어떻게합니까?

감사합니다.

답변

2

당신은 당신의 접근 방식과 문제 수 있습니다. Activity 개체는 대개 UI를 표시하는 데 사용됩니다. 귀하의 경우에는 수신기의 활동을 onCreate으로 등록하는 대신 전체 WifiManager를 브로드 캐스트 리시버로 구현하는 것이 좋습니다.

둘째, 예상 청취자는 무엇입니까? 그들은 다른 활동입니까? Wi-Fi 상태가 변경되면 UI에서 무언가를 변경하려는 의도라고 가정합니다. 한 번에 하나의 활동 만 활성화 될 수 있으므로별로 의미가 없습니다. 에 관계없이 최고 수준의 활동의 변경 무선에 응답해야하는 경우

  • 사용 중간 서비스 :

    은 전반적인 결과를 보면, 두 가지 디자인 옵션을 제안한다.

    1. 등록 방송 수신기는 다음과 같은 방법을 것이다 서비스를 만들기 와이파이 상태
    2. 를 볼 수 있습니다. 하나는 WiFi 변경 메시지에 응답하고 다른 하나는 최상위 활동에서 콜백을 등록하는 것입니다. 콜백 등록을 취소 할 수있는 추가 코드가있을 수 있습니다.
    3. 귀하의 활동에 서비스에 연결하고 MessengeronResume 방법으로 등록하십시오. Deregister는 에 있습니다.

당신은 또한 정상에 올 때 활동의 상태를 갱신해야합니다.

  • 활동이 스택 맨 위에 오면 방금 브로드 캐스트 수신기를 등록하십시오.
+0

이 방법을 시도해보고 결과를 알려줍니다. – FlyingStreudel

+0

대단히 고맙습니다! – FlyingStreudel