私はそれが私の今後のプロジェクトのために私を助けることができるかどうかを確認するためにMVVMを勉強しています。私はこれまで理解して何を、私が使用する必要があるのViewModelを私のUI件のデータを保持するため。私はまた、Webサービスへのすべての私の要求を実行するためにリポジトリクラスを使用する必要がある、と私はボレーライブラリを使用しています。
だからここに私がやったことです:
public class MyViewModel extends ViewModel {
private MyRepository repository;
private MutableLiveData<MyPojo> pojo;
public MyViewModel(MyRepository repository) {
this.repository = repository;
this.pojo = new MutableLiveData<>();
}
public LiveData<MyPojo> updatePojo(){
pojo.postValue(repository.getPojo());
return pojo;
}
}
リポジトリクラス
public class MyRepository {
private Application application;
private LiveData<MyPojo> pojo;
public MyRepository(Application application) {
this.application = application;
}
public MyPojo getPojo(){
if(pojo == null){
ApiRequest apiRequest = new ApiRequest(ApiSingleton.getInstance(application).getRequestQueue(), application);
apiRequest.apiGetRequest(ApiRequest.MY_ENDPOINT, null, new ApiRequest.apiCallback() {
@Override
public void onSuccess(Context context, JSONObject jsonObject) {
pojo = ApiResponseParser.parse(jsonObject, MyPojo.class);
}
@Override
public void onError(Context context, String message) {
}
});
}
return pojo;
}
}
指定されていますここにいることをViewModelには、ビュー、ライフサイクル、または活動のコンテキストへの参照を保持することができる任意のクラスを参照してはなりません。あなたが見ることができるように、私は私のリポジトリクラスのバレーボール要求を実行するためにコンテキストを使用しなければならない、と私のViewModelは、このクラスの参照を持っています。
私は自分のデザインで何かが足りないのですか?バレーボールは、ここでは互換性がありませんか?
代わりに渡すのではApplication
、あなたのMyRepositoryのにconstructor
して作成しApiRequest
、あなたが渡すことができApiRequest
MyRepositoryさんへconstructor
。
public MyRepository(ApiRequest apiRequest) {
this.apiRequest = apiRequest;
}
今MyRepository
への参照を持っていませんContext
。
そして、係るViewModel
への直接参照を持つMyRepository
、あなたが行うことができます依存性逆転を:
作成しinterface
、例えば、MyDataStore
方法でgetPojo()
。MyRepository
これを実装しますinterface
。作成している間MyViewModel
、あなたは合格するMyRepository
ことに、しかしMyViewModel
のみへの参照を持つことになりますMyDataStore
。
interface MyDataStore {
... getPojo()
}
public class MyRepository implements MyDataStore {
...
}
public MyViewModel(MyDataStore dataStore) {
this.dataStore = dataStore;
this.pojo = new MutableLiveData<>();
}