アンドロイド使用ボレーでMVVMアーキテクチャ

EndiveDeCyrodiil:

私はそれが私の今後のプロジェクトのために私を助けることができるかどうかを確認するためにMVVMを勉強しています。私はこれまで理解して何を、私が使用する必要があるのViewModelを私のUI件のデータを保持するため。私はまた、Webサービスへのすべての私の要求を実行するためにリポジトリクラスを使用する必要がある、と私はボレーライブラリを使用しています。

だからここに私がやったことです:

ViewModelに

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、あなたが渡すことができApiRequestMyRepositoryさんへ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<>();
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=364141&siteId=1