Proper use of Observable.create () in RxJava 2 (Best Practices)

I am currently creating a small Social Media style app that uses RxJava 2 and Firebase . I am using MVP style architecture and I have distracted AuthService with AuthSource interface.

For simplicity, I will work with one method in my service:

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.
}

Finally, I will show my Presenter method, which processes the call:

//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();

                                }
                            }
                    )
    );
}

, , . , , Firebase API Create(). , RxJava 2, , . Observable.create() RxJava 2 Docs:

" API ( Observable), .

RxJava 2 Docs , , , Observables, CompositeDisposable.clear() , .


:

- Is it possible to assume that just calling CompositeDisposable.clear (), when Presenter ends, will process my garbage collection? (assuming I did not create a memory leak in the rest of the code).

- If my understanding is correct, create () is a better use case than fromCallable () in this case, since fromCallable () should be used for synchronous events (i.e. not something like Firebase API callbacks)?

Is it really that simple as throwing my asynchronous callbacks into Observable.create ()? I'm afraid how easy it is to do it ...

+4
source share
2 answers

, CompositeDisposable.clear() , ? (, ).

, . Observable , , Observable, Activity. , Activity. , , Activity, , Application, . , CompositeDisposable.clear(), emitter.setCancellable() Observable.create(), .

, create() - fromCallable() , fromCallable() (.. API Firebase)?

create() fromAsync(). fromCallable(), , create() .

, Observable.create()? , ...

... , .

Android Context, . . leakcanary - .

, , Firebase RxJava. :

+4
  • clear - , , Observable, , / , , /.
    , , Observable /.
    , / , (, ), /.

  • , create() - Observable async (BTW, RxJava1, , , RxJava2, , )

  • , , , , (onComplete/onError), onNext (onCompleted/onError) ( Flowable Observable)

0

Source: https://habr.com/ru/post/1669731/


All Articles