如何在android studio中实现observer模式



阅读Headfirst设计模式后,我想知道在我的应用程序中实现观察者设计模式的最简单方法。

上下文:

在应用程序的MainActivity中,用户在EditTextView中输入并单击按钮后,将生成一个URL并发送给其他活动进行显示。(也切换到其他活动1(

我想把我的主体活动作为主体(可观察(,把活动1和活动2作为我的观察者。

我没有使用内置的观察者接口,而是尝试使用自定义的观察者和主题接口来实现这种模式(就像他们在书中所做的那样(。

但这种方式包括在Observer类中创建一个Subject实例,这意味着我将在其他Observer类创建一个MainActivity实例,我不确定它是否有效,有人能告诉我如何正确地执行吗?(或者我就是不能用一个活动作为主题?(

您无法观察不同活动中的对象。您所能做的就是使用Intents在活动之间传递数据。

在Android中,观察者模式是通过使用类ViewModel和类LiveData/StateFlow来实现的。如果您希望有3个不同的屏幕来观察单个对象的变化。您需要有3个片段共享相同的"活动"和相同的ViewModel。

public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}

LiveData是您通过所选变量间接更新的主题。可以通过从Fragment调用select((函数来更改所选变量。在每个片段中,您必须创建ViewModel并观察LiveData。

public class ListFragment extends Fragment {
private SharedViewModel model;
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
model.getSelected().observe(getViewLifecycleOwner(), item -> {
// Update the UI.
});
}
}

您可以在此处阅读有关上面示例的更多信息:https://developer.android.com/topic/libraries/architecture/viewmodel#java

此解决方案也更可取,因为ViewModel在配置更改后仍然有效,并且即使在活动被销毁后也可以恢复活动的状态。

此外,您不应该在另一个活动或ViewModel中保留对一个活动的任何引用,因为这可能会导致内存泄漏。

如果您找到了相同活动或ViewModel的用例,您可以尝试在对象之间创建自己的观察者模式,但在大多数情况下,LiveData和StateFlow应该足以更新您的UI。

任何特定的"活动"实例都是短暂的视图持有者。我之所以说它是短暂的,是因为Android会破坏并重新创建它,以进行任何配置更改,比如屏幕旋转。这就是为什么在不同的活动之间传递引用并非易事。它还会导致内存泄漏在"活动"实例中传播。将活动用作可观察对象是不可行的。

您可以做的是让MainActivity将更改发布到某个存储库类,并让该存储库类公开其他Activities可以查看的可观测值。在这种情况下,存储库必须具有应用程序范围。它可以在应用程序类中惰性地创建,并从应用程序中检索。如果您使用的是依赖注入框架,那么存储库将是应用程序范围内的单例。

活动或片段与存储库交互的常见模式是通过ViewModel类。

最新更新