【问题标题】:How to implement MVVMi in Android (Java, not Kotlin)?如何在 Android(Java,而不是 Kotlin)中实现 MVVMi?
【发布时间】:2021-09-02 04:07:52
【问题描述】:

我正在尝试在 Android(Java,而不是 Kotlin)中实现干净的架构。具体来说,我想实现 MVVMi 模式,在this post 中进行了解释。

我正在使用的其他工具:

  • Hilt,用于依赖注入。
  • 改造/RXJava
  • 房间数据库

我有这样的代码:

交互者

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);
    }
}

用例

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);
    }
}

视图模型

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 代码中找到了this repository,但它使用 Dagger 进行依赖注入,并且存储库的实现方式不同,它使用了转换器等。

我刚刚开始使用干净的架构以及 RXJava,所以我对这一切有点迷茫。

【问题讨论】:

  • 您能否分享您的存储库模块,该模块将提供您的存储库实例,无论何时使用@Inject 请求它
  • @DinkarKumar 我没有存储库模块,我在 ViewModel 中包含存储库,如下所示:@ViewModelInject public BreviarioViewModel(BreviarioRepository breviarioRepository) { this.breviarioRepository = breviarioRepository; breviarioInteractor = new BreviarioInteractor(); } 我不知道我是否错了,但这就是我的理解阅读 Hilt 文档。我已经在没有 Interactor / UseCase 的情况下完成了测试,它可以工作。

标签: android android-mvvm clean-architecture dagger-hilt


【解决方案1】:

我发现了问题:我没有将存储库正确地注入到交互器中。

正如documentation 解释的那样,对象应该被传递给构造函数并用@Inject 注释

交互者

public class BreviarioInteractor {
    private final BreviarioRepository mRepository;

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

然后在 ViewModel 中,我必须在创建交互器时传递存储库参数:

视图模型

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

【讨论】:

    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2017-10-24
    • 2020-05-23
    • 2023-01-23
    相关资源
    最近更新 更多