我正在尝试理解ViewModel和LiveData。
在MainActivity中,我在MyTask中观察LiveData,我在LiveData上设置数据,这些数据应该显示在活动中。
问题是MyTask中的数据集没有在UI上更新。
MainActivity
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");
}
}
发布于 2019-04-02 02:12:20
根据https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54的说法
“而不是试图通过库或架构组件的扩展来解决这个问题,它应该作为一个设计问题来面对。我们建议您将您的事件视为状态的一部分。”
我们不应该共享livedata或viewmodel实例。
Activity -> Viewmodel -> Repository
Activity应包含viewModel的实例。如果单击该按钮,则应通知viewModel启动该任务。在viewmodel中获得响应后,更新livedata。它将在活动中自动收到通知。
发布于 2019-03-25 08:15:09
不需要创建新实例,只需传递已创建的viewmodel实例
public MyTask(MyViewModel myViewModel) {
viewmodel = myViewModel;
}
然后尝试更新Ui
要更新观察者,视图模型需要观察livedata的活动上下文..inside。您正在AsyncTask..
中创建视图模型的单独实例。
https://stackoverflow.com/questions/55329800
复制相似问题