での作業を「やり直し」すること、私はちょうどLiveData
の実験を開始している - 私はViewModel
などLiveData
を使用しています新しいプロジェクト、と忙しい - 私が使用RESTFul
サービスの一部でデータを取得するために、パラメータを取らずにデータを返します。がLiveDataへの変更は、だから、ViewModelに
LiveData
とMVVMパラダイムの典型的なセットアップは、このようなあまりになります
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
今、私たちはこの活動を離れ、そして意図またはいくつかの他の手段を使用することによって、新しい活動に行き、そしてません戻るボタンを押すと(finalize
は呼び出されません)、MyActivity
に戻ってきます。もちろん、そのデータはまだ残っているので、users
を再度取得しないでください。
しかし、再度フェッチしたければどうしますか?
私が見たものから、これを適切に行うための唯一の方法は、このような
何かgetUsers()
LiveData
オブジェクトの「setValueの」と呼んでいるようだ:
public class MyActivity extends AppCompatActivity {
public void onResume() {
viewModel.setActive(true);
}
}
そしてViewModel
が見えますこのように:
private final MutableLiveData<Boolean> activeLiveData = new MutableLiveData<>();
ViewModel(ViewModelRepo repo){
this.repo = repo;
results = Transformations.switchMap(activeLiveData, active ->{
if(active){
return repo.getUsers();
}else {
return AbsentLiveData.create(); //"Null live data"
}
});
}
LiveData<Users>> getUsers() {
return results;
}
//This could be called "update" with no params
void setActive(boolean active) {
activeLiveData.setValue(active);
}
Googleがこのようにすることを決めた理由の1つは、 :このため
class MyViewModel extends ViewModel {
private final PostalCodeRepository repository;
public MyViewModel(PostalCodeRepository repository) {
this.repository = repository;
}
private LiveData<String> getPostalCode(String address) {
// DON'T DO THIS
return repository.getPostCode(address);
}
}
:
これが実装された場合、UIは以前LiveData から登録を解除する必要があるだろうし、新しいインスタンスに再登録するたび 彼らは(getPostalCodeを呼び出します)。さらに、UIが再作成された場合、 は、 前の呼び出しの結果を使用する代わりに、repository.getPostCode()への別の呼び出しをトリガーします。
ViewModel
を「やり直す」にはrepo.getUsers()
を呼び出すより良い方法はありますか?おそらく、私はちょうど "アクティブ"の代わりに "更新()"と言うメソッドを作ることができますが、それは同じことを別のやり方で行います。