我真的很喜欢那种模式。在全局共享对象中实现状态监听的一个例子是
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);
}
}
};
}
这允许您一次使用来自多个地方的相同源,而无需创建多个广播接收器等的开销
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);
}
});
}
}
使用生命周期功能的一大优势是您不必在代码中乱扔 onStart / onStop 调用,此外,您再也不会错过 onStop 调用和泄漏接收器等问题。魔法发生在一些库中,你的代码可以变得相当简单和干净。无论您是实现LifecycleObserver
还是使用LiveData
,如果做得好,您最终会得到更清晰的代码。
让框架处理您的生命周期ViewModel
也很好,但它并没有真正改变 MV* 模式,因为您之前以一种或另一种方式拥有 ViewModel。您可能直接计算了 Activity / Fragment 中的属性。这里的新功能是框架现在为您保留该模型的时间恰到好处。您以前可以使用保留的 Fragment 来做到这一点,而这正是现在幕后发生的事情。