我是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方法)。所以我可以在我的活动上显示错误。
可能是我的问题可能很傻,但我是新手。请帮我。
答案 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);
}
)。