gpt4 book ai didi

java - Android 架构 SingleLiveEvent 和 EventObserver Java 实践示例

转载 作者:行者123 更新时间:2023-12-02 09:54:50 25 4
gpt4 key购买 nike

我尝试制作包含两个字段(用户名,密码)的示例登录页面,并使用android架构组件保存按钮,使用android数据绑定(bind),验证viewmodel中的数据并从 View 模型中调用存储库以进行远程服务器调用,如官方文档中所述,远程服务器成功返回我用户ID,那么如何使用此成功从 View 模型启动新 fragment ?我了解了一些关于 singleLiveEventEventObserver 的知识,但我找不到明确的用法示例:

LoginViewModel

private MutableLiveData<String> snackbarStringSingleLiveEvent= new MutableLiveData<>();

@Inject
public LoginViewModel(@NonNull AppDatabase appDatabase,
@NonNull JobPortalApplication application,
@NonNull MyApiEndpointInterface myApiEndpointInterface) {
super(application);
loginRepository = new LoginRepository(application, appDatabase, myApiEndpointInterface);
snackbarStringSingleLiveEvent = loginRepository.getLogin(username.get(), password.get(), type.get());
}

public MutableLiveData<String> getSnackbarStringSingleLiveEvent() {
return snackbarStringSingleLiveEvent;
}

存储库

public SingleLiveEvent<String> getLogin(String name, String password, String type) {
SingleLiveEvent<String> mutableLiveData = new SingleLiveEvent<>();

apiEndpointInterface.getlogin(name, password, type).enqueue(new Callback<GenericResponse>() {
@Override
public void onResponse(Call<GenericResponse> call, Response<GenericResponse> response) {
mutableLiveData.setValue(response.body().getMessage());
}

@Override
public void onFailure(Call<GenericResponse> responseCall, Throwable t) {
mutableLiveData.setValue(Constant.FAILED);
}
});

return mutableLiveData;
}

登录 fragment

private void observeViewModel(final LoginViewModel viewModel) {
// Observe project data
viewModel.getSnackbarStringSingleLiveEvent().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
}
});
}

在上述情况下如何使用EventObserver?有什么实际例子吗?

最佳答案

查看下面的示例,了解如何创建单个 LiveEvent 以作为 LiveData 仅观察一次:

创建一个名为 Event 的类,如下所示,它将提供一次数据并充当 LiveData 包装器的子级:

public class Event<T> {
private boolean hasBeenHandled = false;
private T content;

public Event(T content) {
this.content = content;
}

public T getContentIfNotHandled() {
if (hasBeenHandled) {
return null;
} else {
hasBeenHandled = true;
return content;
}
}

public boolean isHandled() {
return hasBeenHandled;
}
}

然后像下面这样声明这个 EventObserver 类,这样我们就不会放置条件来检查每次、任何地方处理的Event :

public class EventObserver<T> implements Observer<Event<T>> {
private OnEventChanged onEventChanged;

public EventObserver(OnEventChanged onEventChanged) {
this.onEventChanged = onEventChanged;
}

@Override
public void onChanged(@Nullable Event<T> tEvent) {
if (tEvent != null && tEvent.getContentIfNotHandled() != null && onEventChanged != null)
onEventChanged.onUnhandledContent(tEvent.getContentIfNotHandled());
}

interface OnEventChanged<T> {
void onUnhandledContent(T data);
}
}

以及如何实现它:

MutableLiveData<Event<String>> data = new MutableLiveData<>();

// And observe like below
data.observe(lifecycleOwner, new EventObserver<String>(data -> {
// your unhandled data would be here for one time.
}));

// And this is how you add data as event to LiveData
data.setValue(new Event(""));

引用here 了解详情。

<小时/>

编辑O.P.:

是的,data.setValue(new Event("")); 用于当您从 API 获得响应时存储库(请记住返回不过,与您在 VM 中采用的 LiveData 类型相同,而不是 SingleLiveEvent 类)。

那么,假设您已在 ViewModel 中创建了 LiveData,如下所示:

private MutableLiveData<Event<String>> snackbarStringSingleLiveEvent= new MutableLiveData<>();

您可以从存储库中以单个事件的形式为此实时数据提供值(value),如下所示:

@Override
public void onResponse(Call<GenericResponse> call, Response<GenericResponse> response) {
mutableLiveData.setValue(new Event(response.body().getMessage())); // we set it as Event wrapper class.
}

并在 UI ( fragment ) 上观察它,如下所示:

viewModel.getSnackbarStringSingleLiveEvent().observe(this, new EventObserver<String>(data -> {
// your unhandled data would be here for one time.
}));

关于java - Android 架构 SingleLiveEvent 和 EventObserver Java 实践示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56071990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com