Android 安卓MVVM。生命周期感知模型是代码气味还是正确的设计?
对于我的活动,我需要了解手机的连接状态。 由于这是我的UI需要响应的数据,因此它属于模型领域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,但在上面的情况下,生命周期意识使活动也知道模型 那么,生命
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);
}
});
}
}