android - 需要帮助将 FIrebase 电话身份验证重构为 MVVM 架构
问题描述
我无法弄清楚如何在身份验证后处理从 FirebaseLoginRepository 类返回到 LoginViewModel 的登录结果,例如它是否成功,我应该像在 MVP 模式中那样使用回调侦听器吗?
如果有误解或一些非常规问题,请原谅我,因为这是我在 StackOverflow 上的第一个问题
我不知道我没有丝毫的想法,在互联网上找不到任何有用的东西
public void login{
auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
//using login Result callback as unable to figure out how
//to hand back result to LoginViewModel
//i am certain that doing this breaks the principle of MVVM
loginResultCallback.onSuccess();
}else {
loginResultCallback.onError();
}
}
});
}
解决方案
假设您在后台线程上执行此操作,您可以执行以下操作:
public void login{
CountDownLatch latch = new CountDownLatch(1);
auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
//using login Result callback as unable to figure out how
//to hand back result to LoginViewModel
//i am certain that doing this breaks the principle of MVVM
viewModel.something = something;
}else {
loginResultCallback.onError();
}
latch.countDown();
}
});
try {
latch.await(30000);
} catch (TimeoutException e) {
Log.e("TUT", "Error timeed out", e);
}
}
这允许您阻塞线程并等待回调发生,因此它是一种抽象回调和使用 LiveData 的方法。你只需要知道它对线程做了什么。
除此之外,您应该查看 firebase API 是否具有相同 API 的同步方法。
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
推荐阅读
- php - NativeClient:清单 JSON 解析失败:行:1,列:1,意外令牌
- laravel - Vue.js - 元素 UI - 带有嵌套组件的对话框
- java - 从更大范围的范围列表中删除元素的有效方法
- java - 从 PDF 文件中删除页面,使用 iText,JAVA
- ios - 复制粘贴时,xib 视图中的按钮/文本字段没有反应?
- android - 在 Android 中为 BottomAppBar 实现 app:hideOnScroll
- swift - 出现错误:“ARReferenceObject”类型的值没有成员“合并”:运行 ScanningApp ARKit2 beta
- php - PHP 单元测试通过命令传递配置文件
- php - PHP循环回显CSS类
- database - 数据分散到不同的微服务时如何查询?