- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在构建一个利用 RxJava 2 和 Firebase 的小型社交媒体风格应用程序。我正在使用 MVP 风格的架构,并且我已经使用一个名为 AuthSource 的接口(interface)抽象出我的 AuthService。
为简单起见,我将在我的服务中使用单一方法:
public class FirebaseAuthService implements AuthSource {
private FirebaseAuth auth;
private FirebaseAuth.AuthStateListener listener;
//initialization code
@Override
public Maybe<User> getUser() {
return Maybe.create(new MaybeOnSubscribe<User>() {
@Override
public void subscribe(final MaybeEmitter<User> e) throws Exception {
if (auth == null) {
auth = FirebaseAuth.getInstance();
}
if (listener != null) {
auth.removeAuthStateListener(listener);
}
listener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
auth.removeAuthStateListener(listener);
if (firebaseUser != null) {
User user = new User(
firebaseUser.getDisplayName(),
firebaseUser.getEmail());
user.setUserId(firebaseUser.getUid());
Uri photoUrl = firebaseUser.getPhotoUrl();
if (photoUrl != null){
user.setProfilePhotoUrl(photoUrl.toString());
}
e.onSuccess(user);
} else {
e.onComplete();
}
}
};
auth.addAuthStateListener(listener);
}
}
);
}
interface AuthSource {
Maybe<User> getUser();
//Other methods etc.
}
最后,我将展示处理调用的 Presenter 方法:
//from with a Presenter:
@Override
private void getUserData() {
disposableSubscriptions.add(
auth.getUser().subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.subscribeWith(
new DisposableMaybeObserver<User>() {
@Override
public void onError(Throwable e) {
view.makeToast(R.string.error_retrieving_data);
view.startDispatchActivity();
}
@Override
public void onComplete() {
}
@Override
public void onSuccess(User user) {
ProfilePagePresenter.this.currentUser = user;
view.setName(user.getName());
view.setEmail(user.getEmail());
if (user.getProfilePhotoUrl().equals("")) {
view.setDefaultProfilePhoto();
} else {
view.setProfilePhotoURI(user.getProfilePhotoUrl());
}
getUserProfileFromDatabase();
}
}
)
);
}
我意识到问题的主题有点笼统,所以我会尝试从这里缩小范围。只要我使用 Create() 从 Firebase 的 API 成功获取数据,我在上面发布的代码有效。问题是,我对使用 RxJava 2 还很陌生,我不确定垃圾收集和内存泄漏的幕后情况。根据 RxJava 2 文档,我选择使用 Observable.create():
“提供一个 API(通过冷 Observable),将 react 世界与回调式世界联系起来。”
RxJava 2 Docs最后,我目前为处理这些 Observable 而做的唯一积极主动的事情是,当事件将用户带到新的 Activity 时,在我的 Presenter 中调用 CompositeDisposable.clear() 。
-如果我的理解是正确的,在这种情况下,create() 是比 fromCallable() 更好的选择,因为 fromCallable() 应该用于同步事件(即不是类似 Firebase API 回调的东西)?
-它真的像在 Observable.create() 中抛出我的异步回调一样简单吗?我很害怕这样做是多么容易...
最佳答案
Is it safe to assume that simply calling
CompositeDisposable.clear()
when the Presenter finishes, will handle my Garbage collection? (assuming I haven't created memory leaks in the rest of the code).
它比这更棘手。如果 Observable
引用的所有内容都属于 Activity
范围,则非处置 Observable
不会造成内存泄漏。生产者和消费者都将与 Activity
一起被垃圾回收。如果您引用的资源将在 Activity
中存活下来,例如在 Application
级别实例化的提供程序,则可能会发生内存泄漏。因此,如果您想使用 CompositeDisposable.clear()
,请确保在 Observable.create()
中实现 emitter.setCancellable()
来处理那些泄漏资源。
If my understanding is correct,
create()
is a better option to use thanfromCallable()
in this case, asfromCallable()
should be used for Synchronous events (i.e. not something like Firebase API callbacks)?
create()
用于命名为 fromAsync()
。使用 fromCallable()
包装同步方法调用,使用 create()
包装回调代码。
Is it really as simple as just throwing my Asynchronous callbacks in
Observable.create()
? I'm terrified at how easy that is to do...
这很容易...如果您像第一点提到的那样处理范围之外的那些讨厌的引用。
通常在 Android 上,内存泄漏涉及到很大的 Context
。请务必测试您的代码。 leakcanary对这件事有很大的帮助。
最后,您可以通过使用现有的 Firebase RxJava 绑定(bind)来避免自己进行包装。或者从中获取灵感:
关于java - 在 RxJava 2 中正确使用 Observable.create()(最佳实践),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42233791/
我正在进行 2 个 RX 调用,这些调用相互嵌套且相互依赖。服务器存在问题(由于各种原因目前无法解决),该问题在第二个嵌套调用中返回错误。 在这个问题得到解决之前,我需要确保如果第二次调用返回错误,则
这个问题在这里已经有了答案: How to resolve Duplicate files copied in APK META-INF/rxjava.properties (8 个答案) 关闭 5
我正在尝试将此 RxJava1 代码转换为 RxJava2 public static Observable listFolder(Path dir, String glob) { retur
这个问题在这里已经有了答案: RxJava 1 and RxJava 2 in the same project [duplicate] (1 个回答) How to resolve Duplica
有显示项目的RecyclerViewAdapter(该项目已经映射到数据库中)。 RecyclerViewAdapter 包含对 Presenter 的引用以加载项目。它还包含带有项目 ID 的 Ar
我想弄清楚如何在 Android 中使用 RxJava 将 Realm 对象保存在 Realm 中。到目前为止,结合所有这些的所有示例都是如何从 Realm 读取数据的。我想在 android 中使用
我在日志中收到此错误: Caused by java.lang.ClassCastException: java.net.UnknownHostException cannot be cast to
我有一个 API 服务类,其方法返回 Retrofit 提供的调用。 最近,Rx2Java 引入了 Single,所以我想将 Call 更改为 Single,但我不想更改逻辑。 例如 : 类接口(in
如何使用运算符让我始终获得以前和当前的值?如果可能的话,我想避免在管道外创建状态。 - time -> 1 2 3 4 | | | | Op
我正在努力实现以下目标。我加载了一个对象列表,我想获取稍后放入列表中的值。 首先,我使用 flatmap 将所有值收集到一个数组中(按山顺序),然后当一切完成后,我填充一个适配器。 我无法做的是每
是否可以选择使用 timeout 的变体不发射 Throwable ? 我要 complete事件发出。 最佳答案 您不需要使用 onErrorResumeNext 映射错误。您可以使用以下方法提供备
我们可以在 C# Rx 中异步执行一些代码,如下所示,使用 Observable.Start()。我想知道 RxJava 中的等价物是什么。 void Main() { AddTwoNum
问题:我有一个用户可以输入查询字符串的功能,我制作了 2 个可观察对象,一个用于查询我的本地数据库,另一个用于从 API 获取结果。这两个操作必须并行运行。我需要尽快显示来自数据库的结果,当 API
我正在尝试在 MVVM 中实现 ViewModel,将可观察对象作为“输入流”提供,将观察者作为“输出流”提供以供 View 绑定(bind)。 如果 getUser() 调用成功,下面的代码似乎可以
出于某种原因,我有时想使用 RxOperators 而不是普通的 java 方式来转换数据结构,因为它越来越干净。例如: Observable.from(listOfStrings) .filter(
我是 RxJava 新手,我需要以异步方式使用 Observable 功能。 我还需要使用超时:在我的示例中,我希望每个进程在 1 秒或更短的时间内结束。 这是我现在所做的: public stati
我正在尝试在网络请求期间在UI中显示进度条至少3秒钟。 此答案中描述的相同方法似乎不适用于Single。 RxJava Observable minimum execution time Single
我有一个可观察的(很热),它通过系统进程执行操作,并且我希望也运行一个间隔,直到该进程可观察达到 onComplete。 我看到区间运算符:http://reactivex.io/documentat
好吧,我是 RxJava2 的新手(嗯,我也不了解 RxJava),并且正在尝试使用 RxJava2 和 MVP 结构开发 Android 应用程序。 在该应用程序中,我正在对使用监听器的库进行异步调
如何将单个流拆分为单独的单个流,这样就可以执行以下操作而无需两次计算getUserId()? // getUserId() returns Single getUserId().flatMap { g
我是一名优秀的程序员,十分优秀!