从其他类更新视图模型

时间:2019-03-25 00:10:30

标签: android android-livedata android-viewmodel

我试图了解ViewModel和LiveData。

在MainActivity中,我正在观察LiveData 在MyTask中,我正在LiveData上设置数据,该数据应显示在活动中。

问题是MyTask中设置的数据没有在UI上更新。

MainActivity

php artisan migrate refresh 

ViewModel类

public class MainActivity extends AppCompatActivity {

    private MyViewModel viewModel;
    private TextView tv2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv2 = findViewById(R.id.textView2);

        viewModel = ViewModelProviders.of(this).get(MyViewModel.class);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModel.setNameData("Button clicked");
                new MyTask(getApplication()).execute();
            }
        });

        viewModel.getNameData().observe(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                tv2.setText(s);
            }
        });

    }
}

MyTask类

public class MyViewModel extends AndroidViewModel {

    private MutableLiveData<String> nameData = new MutableLiveData<>();

    public MutableLiveData<String> getNameData() {
        return nameData;
    }

    public void setNameData(String name) {
        nameData.postValue(name);
    }


    public MyViewModel(@NonNull Application application) {
        super(application);
    }
}

2 个答案:

答案 0 :(得分:0)

无需传递新实例,只需传递已创建的viewmodel实例

public MyTask(MyViewModel myViewModel)  { 
   viewmodel = myViewModel;
}

然后尝试更新Ui

  

要更新观察者,视图模型需要活动上下文..在其中观察实时数据..您正在AsyncTask中创建视图模型的单独实例。

答案 1 :(得分:0)

根据https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54

  

”而不是尝试通过库或扩展来解决此问题   体系结构组件,应该作为设计问题来面对。我们   建议您将事件视为州的一部分。”

我们不应共享livedata或viewmodel实例。

Activity -> Viewmodel -> Repository

活动应包含viewModel的实例。如果单击该按钮,则应将其通知给viewModel,该模型将启动任务。在viewmodel中获得响应后,更新实时数据。它将在活动中自动得到通知。