我试图了解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);
}
}
答案 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中获得响应后,更新实时数据。它将在活动中自动得到通知。