gpt4 book ai didi

android - MutableLiveData 的 postValue 方法返回 null

转载 作者:行者123 更新时间:2023-12-03 10:22:13 28 4
gpt4 key购买 nike

我正在实现 Mvvm 模型并尝试使用 MutableLiveData 来监听变化。
有两种方法

  • setValue() - 设置值。如果有活跃的观察者,值将被分派(dispatch)给他们。这个方法必须从主线程调用。
  • postValue() - 当您需要从后台线程设置值时使用 postValue。

  • 这是我正在尝试的代码,当我使用 postValue 并且如果我使用 setValue 它工作正常时,我会得到空值。

    View 模型
    private MutableLiveData<List<Model>> modelsLiveData = new MutableLiveData<>();

    public MainActivityViewModel() {
    modelsLiveData = new MutableLiveData<>();
    }

    public MutableLiveData<List<Model>> getModelsLiveData() {
    return modelsLiveData;
    }

    public void setModelsLiveData(final List<Model> modelsList) {

    new Thread(new Runnable() {
    @Override
    public void run() {
    try {
    Log.i("LIVE_DATA_TEST", Thread.currentThread().toString());
    Thread.sleep(1000);
    modelsLiveData.postValue(modelsList);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    }
    }).start();


    }

    主 Activity
     ActivityMainBinding activityBinding = DataBindingUtil
    .setContentView(this, R.layout.activity_main, new AppDataBindingComponent<>(this));
    MainActivityViewModel viewModel = new MainActivityViewModel();
    activityBinding.setViewModel(viewModel);

    Log.i("LIVE_DATA_TEST", "onCreate: "+ Thread.currentThread());

    List<Model> modelsList = new ArrayList<>();
    modelsList.add(new Model("Suzuki Swift", 2761111));
    modelsList.add(new Model("Renoult Megan", 3679060));
    modelsList.add(new Model("Fiat Panda", 4638764));
    modelsList.add(new Model("Fiat 500", 1234567));
    modelsList.add(new Model("Toyota Land Crouser", 9876543));

    viewModel.setModelsLiveData(modelsList);

    布局
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
    <variable
    name="viewModel"
    type="com.matanmarciano.mvvmlivedata.viewmodels.MainActivityViewModel" />
    </data>

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
    android:id="@+id/models_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:items="@{viewModel.modelsLiveData}" />
    </LinearLayout>

    数据绑定(bind)适配器
    @BindingAdapter({"items"})
    public void items(final RecyclerView recyclerView, List<Model> models) {
    Log.i("LIVE_DATA_TEST", "Let's see if this method is reached" + models);

    // TODO: update recyclerView adapter...
    }

    日志
    这就是我得到的
    I/LIVE_DATA_TEST: onCreate: Thread[main,5,main]
    I/LIVE_DATA_TEST: Thread[Thread-4,5,main]
    I/LIVE_DATA_TEST: Let's see if this method is reached null // null I am getting here when using postValue.

    请帮助我在哪里做错了。

    最佳答案

    您必须添加 setLifecycleOwner 才能从数据绑定(bind)订阅 liveData。

    ActivityMainBinding activityBinding = DataBindingUtil
    .setContentView(this, R.layout.activity_main, new AppDataBindingComponent<>(this));
    activityBinding.setLifecycleOwner(this);

    https://developer.android.com/topic/libraries/data-binding/architecture#livedata

    关于android - MutableLiveData 的 postValue 方法返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57330624/

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