【发布时间】:2019-03-25 00:10:30
【问题描述】:
我正在尝试了解 ViewModel 和 LiveData。
在 MainActivity 中,我正在观察 LiveData 在 MyTask 中,我在 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");
}
}
【问题讨论】:
-
不要在你的任务中创建
MyViewModel的新实例,传入你在Activity中获得的那个 -
@EpicPandaForce 有没有一种方法可以在不通过的情况下在任务中创建实例?我知道拥有单例 ViewModel 类不是一个好主意
-
随便
new MyTask(viewModel) -
是的,我正在尝试探索其他方式,我不想通过任何活动参考。
-
您没有传递 Activity 引用,而是传递了 ViewModel 引用。 ??????
标签: android android-livedata android-viewmodel