从不同的 class 更新视图模型
Update viewmodel from a different class
我正在尝试了解 ViewModel 和 LiveData。
在MainActivity中,我正在观察LiveData
在 MyTask 中,我在 LiveData 上设置数据,应该显示在 activity.
问题是 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);
}
});
}
}
视图模型class
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);
}
}
我的任务class
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
To update the observer the viewmodel needs the activity context ..inside which the livedata is observed.. you are creating a separate instance of the viewmodel inside the AsyncTask..
根据https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54
"Instead of trying to solve this with libraries or extensions to the
Architecture Components, it should be faced as a design problem. We
recommend you treat your events as part of your state."
我们不应该共享 livedata 或 viewmodel 实例。
Activity -> Viewmodel -> Repository
Activity 应该包含 viewModel 的实例。如果单击该按钮,则应将其通知到应启动任务的 viewModel。在 viewmodel 中获得响应后,更新实时数据。它将自动在 Activity.
中收到通知
我正在尝试了解 ViewModel 和 LiveData。
在MainActivity中,我正在观察LiveData 在 MyTask 中,我在 LiveData 上设置数据,应该显示在 activity.
问题是 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);
}
});
}
}
视图模型class
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);
}
}
我的任务class
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
To update the observer the viewmodel needs the activity context ..inside which the livedata is observed.. you are creating a separate instance of the viewmodel inside the AsyncTask..
根据https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54
"Instead of trying to solve this with libraries or extensions to the Architecture Components, it should be faced as a design problem. We recommend you treat your events as part of your state."
我们不应该共享 livedata 或 viewmodel 实例。
Activity -> Viewmodel -> Repository
Activity 应该包含 viewModel 的实例。如果单击该按钮,则应将其通知到应启动任务的 viewModel。在 viewmodel 中获得响应后,更新实时数据。它将自动在 Activity.
中收到通知