【问题标题】:Android asynch static classes?Android异步静态类?
【发布时间】:2011-07-06 18:19:30
【问题描述】:

这是几个问题合而为一的问题。基本上我有一个带有三个选项卡的选项卡式应用程序。每个选项卡都需要访问 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) 如何从一个线程调用方法并让它改变属于另一个线程的变量?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    其次,您期望的听众是什么?他们是其他活动吗?我假设您的意图是在 wifi 状态更改时更改 UI 中的某些内容。由于一次只能激活一项活动,因此没有多大意义。

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

    • 如果您需要响应 WiFi 变化而不考虑顶级活动,请使用中间服务。

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

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

    • 您的活动到达堆栈顶部后,只需注册广播接收器即可。

    【讨论】:

    • 我会尝试这种方法并告诉你结果如何。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-22
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      相关资源
      最近更新 更多