这是一个好方法还是我刚刚找到了一个讨厌的解决方法?
我正在使用MediatorLiveData
类,因为这似乎对更新LiveData
对象的源很有用。
我的意思是,我在互联网上找到的大多数教程都只使用Livedata
或MutableLivedata
而没有动态源,例如:
fun search(/*no input params*/): Call<List<Person>>
但就我而言,我有以下Web服务按名称执行搜索:
interface APIServidor {
@GET("search")
fun search(@Query("name") name: String): Call<List<Person>>
}
public class PeopleRepository {
public LiveData<List<Person>> search(String name){
final MutableLiveData<List<Person>> apiResponse = new MutableLiveData<>();
Call<List<Person>> call = RetrofitService.Companion.getInstance().getApiServer().search(name);
call.enqueue(new Callback<List<Person>>() {
@Override
public void onResponse(@NonNull Call<List<Person>> call, @NonNull Response<List<Person>> response) {
if (response.isSuccessful()) {
apiResponse.postValue(response.body());
}
}
@Override
public void onFailure(@NonNull Call<List<Person>> call, @NonNull Throwable t) {
apiResponse.postValue(null);
}
});
return apiResponse;
}
}
然后在viewmodel类中,我为每个新请求添加源。
public class SearchViewModel extends ViewModel {
private MediatorLiveData<List<Person>> mApiResponse;
private PeopleRepository mApiRepo;
public SearchViewModel() {
mApiResponse = new MediatorLiveData<>();
mApiRepo = new PeopleRepository();
}
public LiveData<List<Person>> getPlayers() {
return mApiResponse;
}
public void performSearch(String name){
mApiResponse.addSource(mApiRepo.search(name), new Observer<List<Person>>() {
@Override
public void onChanged(List<Person> apiResponse) {
mApiResponse.setValue(apiResponse);
}
});
}
}
活动
bt_search.setOnClickListener {
val player_name = et_player.text.toString()
viewModel.performSearch(player_name)
}
我在一个个人项目中
使用MVVM +实时数据+存储库模式
我只发现了一种使用简单方法的教程:观察访问LiveData
对象的repository
对象,并且只获取一次数据。
例如:从Web服务获取所有人(select * from people
)。
我的情况:从网络服务中获取名称(select * from people where name=?
)的人。
https://medium.com/@elye.project/kotlin-and-retrofit-2-tutorial-with-working-codes-333a4422a890 https://medium.com/@sriramr083/error-handling-in-retrofit2-in-mvvm-repository-pattern-a9c13c8f3995
将MediatorLiveData
类用于merge
来自用户输入的所有请求是一个好主意吗?
我应该使用MutableLiveData
并更改repository
类并使用自定义的Clousure吗?
有没有更好的方法?
答案 0 :(得分:0)
我也将这种模式与MediatorLiveData一起使用,但这形成了一个问题。
从用户的角度看,它似乎还可以正常工作,但是这里的一个问题是,每次调用performSearch()
时,存储库都会创建一个新的LiveData对象,该对象另外通过addSource()
添加到MediatorLiveData中。
一个想法可能是让存储库仅创建一次MutableLiveData对象,并且在连续调用时只需更新其值即可。所以MutableLiveData<List<Person>> apiResponse;
将是未初始化的私有字段,将通过search()
方法进行初始化。
例如。 if (apiResponse == null) apiResponse = new MutableLiveData();