Android 安卓MVVM。生命周期感知模型是代码气味还是正确的设计?

Android 安卓MVVM。生命周期感知模型是代码气味还是正确的设计?,android,mvvm,android-architecture-components,android-viewmodel,android-architecture-lifecycle,Android,Mvvm,Android Architecture Components,Android Viewmodel,Android Architecture Lifecycle,对于我的活动,我需要了解手机的连接状态。 由于这是我的UI需要响应的数据,因此它属于模型领域MVVM(如果您不同意,请告诉我) 为了在不需要时不执行代码,我的型号代码当前正在订阅onCreate()中的电话连接更改,并通过实现LifecycleObserver 为此,我在活动代码中实例化模型并将其与viewModel连接起来 不知怎么的,这感觉不对 在理想情况下,活动将是视图层(MVVM中的V)的一部分,并且应该只知道viewModel,但在上面的情况下,生命周期意识使活动也知道模型 那么,生命

对于我的活动,我需要了解手机的连接状态。 由于这是我的UI需要响应的数据,因此它属于模型领域MVVM(如果您不同意,请告诉我)

为了在不需要时不执行代码,我的型号代码当前正在订阅
onCreate()
中的电话连接更改,并通过实现
LifecycleObserver

为此,我在活动代码中实例化模型并将其与viewModel连接起来

不知怎么的,这感觉不对

在理想情况下,活动将是视图层(MVVM中的V)的一部分,并且应该只知道viewModel,但在上面的情况下,生命周期意识使活动也知道模型


那么,生命周期感知模型是正确的概念吗?或者我应该重新考虑设计吗?

我真的很喜欢这种图案。在全局可共享对象中实现状态侦听的示例如下

public class WifiState {
    private static WifiState instance;
    public static synchronized WifiState getInstance(Context context) {
        if (instance == null) instance = new WifiState(context.getApplicationContext());
        return instance;
    }

    private final Context context;
    private final WifiManager wm;
    private WifiState(Context context) {
        this.context = context;
        wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    }

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
            wifiStateLiveData.setValue(state);
        }
    };

    public LiveData<Integer> wifiState() { return wifiStateLiveData; }

    private final MutableLiveData<Integer> wifiStateLiveData = new MutableLiveData<Integer>() {

        @Override
        protected void onActive() {
            setValue(wm.getWifiState()); // update immediately
            context.registerReceiver(receiver, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION));
        }
        @Override
        protected void onInactive() {
            context.unregisterReceiver(receiver);
        }

        @Override
        public void setValue(Integer value) { // debounce non-change
            Integer old = getValue();
            if (old == null && value != null || old != null && !old.equals(value)) {
                super.setValue(value);
            }
        }
    };
}
使用生命周期功能的最大优点是,您不必在启动/启动调用中浪费代码,此外,您再也不能错过启动调用和泄漏接收器(例如)。这种神奇发生在某些库中,您的代码可以变得相当简单和干净。无论您是实现
LifecycleObserver
还是使用
LiveData
,只要做得好,最终都会得到更干净的代码


让框架处理您的
ViewModel
的生命周期也很好,但是它在MV*模式方面并没有太大的改变,因为您以前有过这样或那样的ViewModel。您可能直接计算了活动/片段中的属性。这里的新功能是framwork现在为您保留该模型的时间正好合适。你以前可以用一个保留的片段来做这件事,而这正是现在在幕后发生的事情。

不确定你到底是怎么做的,但是为什么你认为安卓团队推出了整个生命周期/livedata/viewmodel?所有这些MV*模型在最终拥有良好的解耦代码时并不重要。在某些(可能是上下文单例)的
LiveData
对象下公开状态非常好。谢谢。这就是我正在做的。我没有显示toast,而是连接了ViewModel:
WifiState.getInstance(this.WifiState().observe(this,myViewModel::onStateChanged)
public class SomeActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WifiState.getInstance(this).wifiState().observe(this, state -> {
            if (state != WifiManager.WIFI_STATE_ENABLED) {
                Toast.makeText(this, "Please enable WIFI", Toast.LENGTH_LONG);
            }
        });
    }
}