Я пытаюсь реализовать чистую архитектуру в 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, поэтому я немного потерялся во всем этом.
@ViewModelInject public BreviarioViewModel(BreviarioRepository breviarioRepository) { this.breviarioRepository = breviarioRepository; breviarioInteractor = new BreviarioInteractor(); }
Я не знаю, ошибаюсь ли я, но именно так я понял, прочитав документацию Hilt. Я проводил тесты без Interactor / UseCase, и он работает. - person A. Cedano   schedule 17.06.2021