2011-07-06 64 views
0

這是幾個問題之一。基本上我有一個帶有三個選項卡的選項卡應用程序。每個選項卡都需要訪問Web服務和WiFi API。我想通過爲所有這些共享功能創建兩個靜態包裝類來簡化這一過程,以便所有三個活動都可以使用相同的靜態類。Android異步靜態類?

我在android/java中相當不實用,所以我在這裏尋找一些指針。

作爲一個例子,這裏是我的Wifi類,只要它接收到它們,它就會將偵聽器和發佈掃描結果註冊到它們。由用戶決定是否要關注他們。

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); 
    } 
} 

這有效嗎?或者我不知道android應用程序的生命週期?我的方式有什麼陷阱?

另外,如果WifiManagerActivity位於單獨的線程上,它如何處理調用需要與另一個線程上的變量一起工作的方法?在C#中,我將使用調度程序來調用它,但使用java/android?

總結:

1)我目前的計劃有任何問題或建議?
2)如何從一個線程調用一個方法,並讓它改變屬於另一個線程的變量?

謝謝!

回答

2

你帶來很多問題你的方法。通常使用Activity對象來顯示UI。在你的情況下,你可能想要將整個WifiManager實現爲廣播接收器,而不是在活動的onCreate中註冊接收器。

其次,你期望的聽衆是什麼?他們是其他活動嗎?我認爲你的意圖是當WiFi狀態改變時改變UI中的某些東西。由於一次只有一項活動可以活躍,因此沒有多大意義。

總的來說,我提出了兩種設計方案:

  • 使用中間服務,如果您需要到WiFi應對變化,無論頂級活動。

    1. 註冊廣播接收器觀看的WiFi狀態
    2. 創建服務,將有以下方法。一個用於響應WiFi更改消息,另一個用於註冊頂級活動的回調。可能多一個註銷回調。
    3. 在您的活動中連接到服務和註冊回調MessengeronResume方法。取消登記在。

您還需要刷新活動的狀態,當涉及到頂部。

  • 只要您的活動進入堆棧頂部,只需註冊廣播接收器即可。
+0

我會嘗試這種方法,讓你知道它是如何結果。 – FlyingStreudel

+0

很好,謝謝! – FlyingStreudel