从其他类更新viewmodel

问题描述 投票:0回答:2

我想了解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");

    }
}
android android-livedata android-viewmodel
2个回答
0
投票

而不是创建新实例只需传递已创建的viewmodel实例

public MyTask(MyViewModel myViewModel)  { 
   viewmodel = myViewModel;
}

然后尝试更新Ui

要更新观察者,viewmodel需要活动上下文..inside中观察到的数据..你正在AsyncTask中创建一个单独的viewmodel实例。


0
投票

根据https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54

“而不是尝试使用库或扩展到架构组件来解决这个问题,它应该面临设计问题。我们建议您将事件视为您所在州的一部分。”

我们不应该共享livingata或viewmodel实例。

Activity -> Viewmodel -> Repository

Activity应包含viewModel的实例。如果单击该按钮,则应将其通知给将启动任务的viewModel。在viewmodel中获得响应后,更新livedata。它将自动在活动中得到通知。

© www.soinside.com 2019 - 2024. All rights reserved.