gpt4 book ai didi

Android 存储库模式 : how pass extra data to Fragment/Activity

转载 作者:行者123 更新时间:2023-11-29 16:33:59 25 4
gpt4 key购买 nike

我阅读了本指南:https://developer.android.com/jetpack/docs/guide enter image description here 并尝试在这种情况下使用存储库模式:

应用程序通过 Retrofit lib 向服务器 /get/user 发出 GET 请求,服务器的响应可能是这样的(状态为 200):

 {
"user": {"name" : "Jack", "id": "99"},
"status": true
}

或者像这样(状态为 200):

{ "status": false, "message": "Some error here"}

或者,例如 500 错误。

我的 UserFragment 应该显示对话框,具体取决于服务器响应:如果一切正常 - ok 消息,如果状态为 false - 来自 api 响应的错误消息,如果 500 - 其他错误消息。

我的 POJO 模型如下所示:

public class User {
private String id;
private String name;
// getters and setters omitted
}


public class ApiResponse {
private User user;
private Boolean status;
private String message;
// getters and setters omitted
}

我应该如何在存储库模式中处理它?<​​/p>

  1. 我的存储库对象是否应该将 User 返回给 ViewModel?如果是 - 我的 ViewModel 如何知道 api 响应的状态和消息字段?
  2. 或者我的存储库对象应该直接将 ApiResponse 返回给 ViewModel,然后 ViewModel 从中获取状态、消息和用户并将它们传递给 Fragment?但是如果我想将用户缓存到数据库怎么办?我们需要将所有 ApiResponse 存储到数据库还是只需要存储用户?
  3. 还是别的什么……?

我更喜欢 1,因为它对我来说更清晰,但我的问题 - 如何处理状态和消息字段,从服务器返回并需要在 Fragment 中显示数据。

最佳答案

我是这样操作的:

存储库:

prival final MutableLiveData<User> userData = new MutableLiveData<>();

public void getUser(){
//post user to userData when you got response from the server
}
public LiveData<User> getUserData(){ return userData; }

View 模型:

public LiveData<User> user = Repository.getInstance().getUserData();

在这种情况下,您的 viewModel 不会每次都创建 liveData,它会从 Repository 中获取 liveData。此外,您将在您的存储库中加载数据,因此您不必经常触发调用。

如果您需要了解每个调用状态,请在 liveData 和 response obj livedata 中使用您的 NetworkState 枚举创建类似 DataSource holder 对象的对象

这是我的远程数据源:

public class RemoteDataSource<T> {
private final MutableLiveData<NetworkState> networkState = new MutableLiveData<>();
private final MutableLiveData<T> data = new MutableLiveData<>();
private final Action action;
private String errorMessage;

public RemoteDataSource(Action action) {
networkState.postValue(NetworkState.Default);
this.action = action;
}

public MutableLiveData<NetworkState> getNetworkState() {
return networkState;
}

public void setIsLoading() {
networkState.postValue(NetworkState.Loading);
}

public void setDefault() {
networkState.postValue(NetworkState.Default);
}

public void setIsLoaded(T data) {
networkState.postValue(NetworkState.Loaded);
this.data.postValue(data);
}

public void setFailed(@NonNull String errorMessage) {
this.errorMessage = errorMessage;
networkState.postValue(NetworkState.Failed);
}

public String getErrorMessage() {
return errorMessage;
}

public MutableLiveData<T> getData() {
return data;
}

public void executeLoad() {
if (action != null) {
try {
action.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

关于Android 存储库模式 : how pass extra data to Fragment/Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53097465/

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