我想了解ViewModel和LiveData。
在MainActivity中,我观察LiveData在MyTask中,我在LiveData上设置数据,应该在活动中显示。
问题是MyTask中的数据集未在UI上更新。
主要信息
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);
}
});
}
}
ViewModel类
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);
}
}
MyTask类
public class MyTask extends AsyncTask<Void, Void, Void> {
private MyViewModel viewModel;
public MyTask(Application application){
viewModel = new MyViewModel(application);
}
@Override
protected Void doInBackground(Void... voids) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
viewModel.setNameData("Done task");
}
}
而不是创建新实例只需传递已创建的viewmodel实例
public MyTask(MyViewModel myViewModel) {
viewmodel = myViewModel;
}
然后尝试更新Ui
要更新观察者,viewmodel需要活动上下文..inside中观察到的数据..你正在AsyncTask中创建一个单独的viewmodel实例。
根据https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54
“而不是尝试使用库或扩展到架构组件来解决这个问题,它应该面临设计问题。我们建议您将事件视为您所在州的一部分。”
我们不应该共享livingata或viewmodel实例。
Activity -> Viewmodel -> Repository
Activity应包含viewModel的实例。如果单击该按钮,则应将其通知给将启动任务的viewModel。在viewmodel中获得响应后,更新livedata。它将自动在活动中得到通知。