1

での作業を「やり直し」すること、私はちょうど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()を呼び出すより良い方法はありますか?おそらく、私はちょうど "アクティブ"の代わりに "更新()"と言うメソッドを作ることができますが、それは同じことを別のやり方で行います。

答えて

1

ここで、物事をロックするViewModelの作成者でフェッチしています。通常、データがまだ存在しない場合は、ゲッターでデータを取得するように指示します。その後、あなたは「ユーザーをリフレッシュ」する必要が感じるたびにあなたの活動/フラグメント、から、あなたは、単にviewModel.fetchUsers();

を呼びたい

private MutableLiveData<Users> users = null; 

ViewModel(ViewModelRepo repo){ 
     this.repo = repo; 
    } 

    LiveData<Users> getUsers() { 
    if (users = null) { 
     fetchUsers(); 
    } 
    return users; 
    } 

    public void fetchUsers() { 
    users.postValue(repo.getUsers()); 
    } 

そして:

はとても良いオプションは、最初の規則的なパターンを使用することです

関連する問題