从不同的 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.

中收到通知