Android 当与LiveData一起使用时,return语句有什么用途
我遵循了一个集成的Android 当与LiveData一起使用时,return语句有什么用途,android,performance,viewmodel,android-architecture-components,android-viewmodel,Android,Performance,Viewmodel,Android Architecture Components,Android Viewmodel,我遵循了一个集成的ViewModel和LiveData示例 我将LiveData用于ViewModel到Repository通信,将activity到ViewModel通信 我想澄清一下这个问题,我没有什么疑惑 这工作正常,在MainActivity上5秒钟后显示Toast消息 main活动 MainViewModel homeViewModel = ViewModelProviders.of(this).get(MainViewModel.class); homeViewMo
ViewModel
和LiveData
示例
我将LiveData
用于ViewModel
到Repository
通信,将activity
到ViewModel
通信
我想澄清一下这个问题,我没有什么疑惑
这工作正常,在MainActivity上5秒钟后显示Toast消息
main活动
MainViewModel homeViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
homeViewModel.getResponseval().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
Toast.makeText(getApplicationContext(), "MainActivityObserverCalled", Toast.LENGTH_LONG).show();
}
});
public class LoginRepositry {
private MutableLiveData<String> data = new MutableLiveData<>();
public MutableLiveData<String> getData(String username , String userpass) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
data.setValue("Login Repo Set Value");
}
}, 5000);
return data;
}
MainViewModel homeViewModel=ViewModelProviders.of(this.get)(MainViewModel.class);
homeViewModel.getResponseval().observe(这是一个新的观察者(){
@凌驾
公共void onChanged(@Nullable String s){
Toast.makeText(getApplicationContext(),“MainActivityObserverCalled”,Toast.LENGTH\u LONG.show();
}
});
MainViewModel
public class MainViewModel extends ViewModel {
public MutableLiveData<String> responseval;
private LoginRepositry loginRepositry;
public MainViewModel(){
loginRepositry = new LoginRepositry();
responseval = loginRepositry.getData("username","password");
}
public MutableLiveData<String> getResponseval() {
return responseval;
}
public类MainViewModel扩展了ViewModel{
公共可变实时数据响应;
私人登录回复登录回复;
公共主视图模型(){
LoginRepository=新的LoginRepository();
responseval=loginrepository.getData(“用户名”、“密码”);
}
公共可变LiveData getResponseval(){
返回响应评估;
}
登录回复
MainViewModel homeViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
homeViewModel.getResponseval().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
Toast.makeText(getApplicationContext(), "MainActivityObserverCalled", Toast.LENGTH_LONG).show();
}
});
public class LoginRepositry {
private MutableLiveData<String> data = new MutableLiveData<>();
public MutableLiveData<String> getData(String username , String userpass) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
data.setValue("Login Repo Set Value");
}
}, 5000);
return data;
}
公共类登录回复{
私有MutableLiveData=new MutableLiveData();
public MutableLiveData getData(字符串用户名、字符串userpass){
new Handler().postDelayed(new Runnable()){
@凌驾
公开募捐{
data.setValue(“登录回购设置值”);
}
}, 5000);
返回数据;
}
这是我的两个问题
- 现在,对于每个方法,我都返回一些类型为
的数据,但是 返回数据时,该值未设置。我在5之后设置它 秒LiveData
,那么data.setValue(“SomeValue”)
在这里,它仅仅是因为方法返回类型,而在return
LiveData
- 在
,我使用了main活动中
对于观察者数据,但是在homeViewModel.getResponseval()。观察
中,我没有使用ViewModel
,而是 ViewModel仍在观察observe
,5秒后 MainActivity得到了一个结果。我无法理解这里发生了什么存储库
LifeCycleOwner
)。因此,在所有者中,您开始观察该“数据持有者”,并在新数据到达时收到警告
在MainActivity中,我使用了homeViewModel.getResponseval()。观察
观察者数据,但在ViewModel中,我没有使用观察,而是使用ViewModel
仍在观察存储库,并在5秒后执行main活动
获取结果。我无法理解这里发生了什么
您需要一个
LifeCycleOwner
来观察来自LiveData
的更新,以及来自文档的更新:“LiveData
认为由观察者类表示的观察者在其生命周期处于启动或恢复状态时处于活动状态。LiveData仅通知活动观察者更新。"为了检测状态,它需要一个LifeCycleOwner
,这就是为什么当你使用observe
方法时,你会将这个
作为一个参数传递。这就是为什么你没有在视图模型中使用observe
,还有一个问题,比如说视图模型中是否有10个我需要的函数观察,然后我将使用观察者(这个,…)
对于所有这些活动?理论上是的,但您的代码结构不应允许这样做。通常在活动中,您希望保持单一责任原则,因此,让10种不同类型的LiveData来观察您的活动是否应具有单一责任没有多大意义。:)在MainActivity上,我执行以下任务sendUserLocationServer、getNewsFromServer、getEventsFromServer、CheckIfPromotiAvailable、sendFCMTokenToServer、getJWTToken from server
因此,对于所有这些,我将创建一个单独的观察者observer(此,…)
Yep,如果您返回LiveData,则需要通过观察者获取值