2011-07-06 39 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