Как реализовать MVVMi в Android (Java, а не Kotlin)?

Я пытаюсь реализовать чистую архитектуру в Android (Java, а не Kotlin). В частности, я хочу реализовать шаблон MVVMi, описанный в этот пост.

Другие инструменты, которые я использую:

  • Рукоять для внедрения зависимостей.
  • Модернизация / RXJava
  • База данных номеров

У меня есть такой код:

Interactor

public class BreviarioInteractor {

    @Inject
    public BreviarioRepository mRepository;

    public Observable<JsonElement> searchBreviario(String query, HashMap<String,String> map) {
        Log.d("BreviarioInteractor","a");
        return new GetBreviarioUseCaseImpl(mRepository).getBreviario(query,map);
    }
}

UseCase

public class GetBreviarioUseCaseImpl {
    @Inject
    public BreviarioRepository mRepository;

    public GetBreviarioUseCaseImpl(BreviarioRepository mRepository) {
        this.mRepository = mRepository;
        //mRepository is NULL here
        Log.d("aaa",this.mRepository.toString());

    }

    public Observable<JsonElement> getBreviario(String query, HashMap<String,String> map) {
        return mRepository.getBreviario(query,map);
    }
}

Репозиторий

public class BreviarioRepository {
    private static final String TAG = "BreviarioRepository";

    ApiService apiService;

    @Inject
    public BreviarioRepository(ApiService apiService) {
        this.apiService = apiService;
    }


    public Observable<JsonElement> getBreviario(String query, HashMap<String,String> map){
        Log.d("abcd-2","b");
        return apiService.getBreviario(query,map);
    }
}

ViewModel

public class BreviarioViewModel extends ViewModel {
    private static final String TAG = "BreviarioViewModel";

    private BreviarioRepository breviarioRepository;
    private BreviarioInteractor breviarioInteractor;

    private final CompositeDisposable disposables = new CompositeDisposable();
    private final MutableLiveData<ApiResponse> mLiveData = new MutableLiveData<>();


    @ViewModelInject
    public BreviarioViewModel(BreviarioRepository breviarioRepository) {
        this.breviarioRepository = breviarioRepository;
        breviarioInteractor = new BreviarioInteractor();

    }

    // ...

    public void loadBreviario(String theDate, HashMap<String, String> map) {
        Log.d("abcd1","a");

        disposables.add(breviarioInteractor.searchBreviario(theDate, map)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe((d) -> mLiveData.setValue(ApiResponse.loading()))
                .subscribe(
                        result -> mLiveData.setValue(ApiResponse.success(result)),
                        throwable -> mLiveData.setValue(ApiResponse.error(throwable))
                ));
    }


    //...

    @Override
    protected void onCleared() {
        super.onCleared();
        disposables.clear();
    }

}

Эта проблема

Моя проблема здесь в том, что репозиторий в UseCase равен нулю.

Я ценю любую помощь в решении этой проблемы, а также любые предложения по улучшению моего кода.

Я искал примеры, которые безуспешно реализуют MVVMi. Большинство примеров основано на Kotlin. Я нашел этот репозиторий в коде Java, но он использует Dagger для внедрения зависимостей, и репозиторий реализован иначе, он использует конвертеры и т. д.

Я только начинаю работать с чистой архитектурой, а также с RXJava, поэтому я немного потерялся во всем этом.


person A. Cedano    schedule 17.06.2021    source источник
comment
Можете ли вы поделиться своим модулем репозитория, который будет предоставлять экземпляр вашего репозитория, где бы он ни был запрошен, используя @Inject   -  person DinkarKumar    schedule 17.06.2021
comment
@DinkarKumar У меня нет модуля репозитория, я включаю репозиторий в ViewModel следующим образом: @ViewModelInject public BreviarioViewModel(BreviarioRepository breviarioRepository) { this.breviarioRepository = breviarioRepository; breviarioInteractor = new BreviarioInteractor(); } Я не знаю, ошибаюсь ли я, но именно так я понял, прочитав документацию Hilt. Я проводил тесты без Interactor / UseCase, и он работает.   -  person A. Cedano    schedule 17.06.2021


Ответы (1)


Я обнаружил проблему: я неправильно вставлял репозиторий в интерактор.

Как объясняется в документации, объект должен быть передан в конструктор и помечен @Inject

Interactor

public class BreviarioInteractor {
    private final BreviarioRepository mRepository;

    @Inject
    public BreviarioInteractor(BreviarioRepository mRepository) {
        this.mRepository = mRepository;
    }

Затем в ViewModel мне нужно передать репозиторий в параметре при создании Interactor:

ViewModel

@ViewModelInject
public BreviarioViewModel(BreviarioRepository breviarioRepository) {
    this.breviarioRepository = breviarioRepository;
    breviarioInteractor = new BreviarioInteractor(breviarioRepository);
}
person A. Cedano    schedule 18.06.2021