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);
返回数据;
}
这是我的两个问题

  • 现在,对于每个方法,我都返回一些类型为
    LiveData
    的数据,但是 返回数据时,该值未设置。我在5之后设置它 秒
    data.setValue(“SomeValue”)
    ,那么
    return
    在这里,它仅仅是因为方法返回类型,而在
    LiveData

  • main活动中
    ,我使用了
    homeViewModel.getResponseval()。观察
    对于观察者数据,但是在
    ViewModel
    中,我没有使用
    observe
    ,而是 ViewModel仍在观察
    存储库
    ,5秒后 MainActivity得到了一个结果。我无法理解这里发生了什么


所以让我们分部分来做:

现在,对于每个方法,我都返回一些LiveData类型的数据,但是 返回数据的时间,未设置值。我在5之后设置 seconds data.setValue(“SomeValue”),那么这里的return有什么用呢, 是否只是因为方法返回类型,而在 实时数据

如果您检查,您将看到LiveData“是一个可观察的数据持有者类”,因此它持有数据,您可以观察它。这对于理解为什么要在此处返回此LiveData对象非常重要。通过返回它,您可以告诉您的体系结构的下一层(ViewModel)“嘿,这是这个支架,我会在某个时候把一些数据放在这里,所以如果你想接收数据,请观察它”

ViewModel不观察它,只是将它传递给对该数据持有者感兴趣的下一个实体,即UI(
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,则需要通过观察者获取值