Android异步静态类?

时间:2011-07-06 18:19:30

标签: java android multithreading event-handling android-wifi

这是一个问题。基本上我有一个带有三个选项卡的选项卡式应用程序。每个选项卡都需要访问Web服务和wifi API。我想通过为所有这些共享功能创建两个静态包装类来简化这一过程,以便所有三个活动都可以使用相同的静态类。

我在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 个答案:

答案 0 :(得分:2)

您的方法存在许多问题。 Activity个对象通常用于显示UI。在您的情况下,您可能希望将整个WifiManager实现为广播接收器,而不是在活动的onCreate内注册接收器。

其次,你期待的听众是什么?他们是其他活动吗?我假设你的目的是在wifi状态改变时改变UI中的某些东西。由于一次只能激活一个活动,因此没有多大意义。

总的来说,我提出了两种设计方案:

  • 如果您需要响应WiFi更改,请使用中间服务,无论顶级活动如何。

    1. 注册广播接收器以观看WiFi状态
    2. 创建具有以下方法的服务。一个用于响应WiFi更改消息,另一个用于注册来自顶级活动的回调。可能是额外的一个注销回调。
    3. 在您的活动中,连接到服务并在Messenger方法中注册回调onResume。取消注册onPause

当涉及到顶部时,您还需要刷新活动状态。

  • 只要您的活动到达堆栈顶部,就可以注册广播接收器。

答案 1 :(得分:0)

听起来您希望这些内容在Service而不是Activity中运行。

http://developer.android.com/reference/android/app/Service.html