【发布时间】:2017-02-14 18:37:37
【问题描述】:
我目前正在构建一个利用 RxJava 2 和 Firebase 的小型社交媒体风格应用程序。我正在使用 MVP 风格的架构,并且我已经使用一个名为 AuthSource 的接口抽象出了我的 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 Docs,我选择使用 Observable.create():
“提供一个 API(通过冷的 Observable)将反应式世界与回调式世界连接起来。”
RxJava 2 Docs 最后,我目前处理这些 Observable 的唯一主动措施是,当事件将用户带到新的 Activity 时,在我的 Presenter 中调用 CompositeDisposable.clear()。
问题:
- 假设在 Presenter 完成时简单地调用 CompositeDisposable.clear() 是否可以安全地处理我的垃圾收集? (假设我没有在其余代码中创建内存泄漏)。-如果我的理解是正确的,在这种情况下 create() 是比 fromCallable() 更好的选择,因为 fromCallable() 应该用于同步事件(即不是像 Firebase API 回调这样的东西)?
-真的像在 Observable.create() 中抛出我的异步回调一样简单吗?我害怕这样做是多么容易......
【问题讨论】:
标签: java android rx-java rx-android rx-java2