如何从完成

时间:2018-04-20 10:56:27

标签: android mvvm rx-java2 android-databinding android-room

我是rxjava,room和mvvm架构的初学者。我正在尝试使用Rxjava从房间数据库中获取用户。

当我成功获得用户时,我想展示祝酒并开始另一项活动。如果失败,我将在文本输入布局中显示错误消息。

我尝试使用以下代码来做到这一点。

在我的活动中,我有一个方法authorizeUser(),可以在按钮点击时调用。

private void authorizeUser() {

    loginViewModel.checkInDb()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onComplete() {
                    Log.e("Action", "Complete");
                    showToast();
                    startAnotherActivity();
                }

                @Override
                public void onError(Throwable e) {
                    Log.e("Action", "error");
                    showError();
                }
            });
}

在我的 ViewModel

public Completable checkInDb() {

    Completable completable= Completable.fromAction(() ->
            userDataSource.getSingleRecordFromName(name.get(), password.get())
                    .subscribe(new SingleObserver<User>() {
                @Override
                public void onSubscribe(Disposable d) {
                    isLoading.set(true);
                }

                @Override
                public void onSuccess(User user) {
                    preference.save(Constants.CURRENT_USER, user)
                            .subscribe();
                    isLoading.set(false);
                    isComplete=true;
                    Log.e("got","success");
                }

                @Override
                public void onError(Throwable e) {
                    isLoading.set(false);
                    passwordError.postValue(new Error("Username or password is incorrect"));
                    Log.e("got","failure");
                    isComplete=false;
                }
            }));

    return completable;

}
UserDataSource类

中的

public Single<User> getSingleRecordFromName(String strName) {
    return daoAccess.getSingleRecord(strName);
}

DaoAccess课程

public Single<User> getSingleRecordFromName(String strName) {
    return daoAccess.getSingleRecord(strName);
}

使用上面的代码,onComplete方法总是在activity中调用,weather in view模型,用户是否成功获取

但我想要做的是,我想抛出错误或在抛出错误时向活动发送通知(或者在viewmodel中调用Error方法)。所以我可以在我的活动上显示错误。

可能是我的问题可能很傻,但我是新手。请帮我。

1 个答案:

答案 0 :(得分:0)

虽然最好将响应包装在public function postSignIn(Request $request) { $this->validate($request, [ 'email' => 'required', 'password' => 'required' ]); if (Auth::attempt(['email' => $request['email'], 'password' => $request['password'], 'active' => 1])) { return redirect()->route('dashboard'); } return redirect()->back()->with('message', 'Email address and Password mismatch or account not yet activated.'); } 中,这样您就可以免费获得订阅/生命周期“,除非有特定需求才能获得完整的用户界面,我没有任何理由)。

我会改为将您的LiveData更改为Dao而不是Observable,然后(再次,这不是最佳解决方案,应该包装到LiveData中)您可以返回{ {1}}到用户界面:

Single

并更改您的Daos

UserDataSource

中的

Observable

并在 DaoAccess

public Observable checkInDb() {

    return userDataSource.getSingleRecordFromName(name.get(), password.get())
                    .subscribe(new SingleObserver<User>() {
                @Override
                public void onSubscribe(Disposable d) {
                    isLoading.set(true);
                }

                @Override
                public void onSuccess(User user) {
                    preference.save(Constants.CURRENT_USER, user)
                            .subscribe();
                    isLoading.set(false);
                    isComplete=true;
                    Log.e("got","success");
                }

                @Override
                public void onError(Throwable e) {
                    isLoading.set(false);
                    passwordError.postValue(new Error("Username or password is incorrect"));
                    Log.e("got","failure");
                    isComplete=false;
                }
            }));
}

所以现在你的视图可以checkInDb()并处理这些情况。

PS:我假设这个public Observable<User> getSingleRecordFromName(String strName) { return daoAccess.getSingleRecord(strName); } 不是API调用而是本地数据库(可能是public Observable<User> getSingleRecordFromName(String strName) { return daoAccess.getSingleRecord(strName); } )。