Is disposable in “doOnSubscribe” method and the disposable returned by “subscribe” method are...












0















I have a BaseViewModel as:



public class BaseViewModel extends ViewModel {

private MutableLiveData<ApiError> apiError = new MutableLiveData<>();
private MutableLiveData<ApiProgress> apiProgress = new MutableLiveData<>();
private CompositeDisposable compositeDisposable = new CompositeDisposable();

// Emit "progress's start" on subscribe and "progress's end" on after success or error.
// Add this to the observable action sequence with ".compose(baseTransformer())" before subscribe.
<T> SingleTransformer<T, T> baseTransformer() {
return upstream -> upstream
.doOnSubscribe(disposable -> {
Log.d("dis", "doOnSubscribe : " + disposable + " " + disposable.isDisposed());
compositeDisposable.add(disposable);
apiProgress.setValue(ApiProgress.start());
})
.doOnDispose(() -> Log.d("dis", "I am disposed.."))
.doFinally(() -> apiProgress.setValue(ApiProgress.stop()))
.doOnError(err -> {
apiError.setValue(ApiError.create(err));
});
}

public LiveData<ApiError> getApiError() {
return apiError;
}

public LiveData<ApiProgress> getApiProgress() {
return apiProgress;
}

@Override
protected void onCleared() {
super.onCleared();
if (!compositeDisposable.isDisposed()) {
compositeDisposable.dispose();
Log.d("dis", "compositeDisposable disposed");
}
}
}


and a LoginViewModel as:



public class LoginViewModel extends BaseViewModel {

Disposable disposable;
private AuthRepository authRepository;
private MutableLiveData<Login> loginData = new MutableLiveData<>();

public LoginViewModel() {
authRepository = new AuthRepository();
}

public LiveData<Login> getLoginData() {
return loginData;
}

public void login(String userName, String password) {
disposable = authRepository.login(userName, password)
.compose(baseTransformer())
.subscribe(login -> loginData.setValue(login), err -> {
});
}

@Override
protected void onCleared() {
super.onCleared();
Log.d("dis", "LoginViewModel : " + disposable + " " + disposable.isDisposed());
}
}


I want to dispose the disposable returned by subscribe method but I want to do it in transformation function so, I don''t need to do it every time.



I got following output in Logs:



D/dis: doOnSubscribe : null false
D/dis: compositeDisposable disposed
D/dis: LoginViewModel : 0 false


Please help me in understand: why the disposable not disposed even after compositeDisposable disposed successfully.










share|improve this question























  • doOnSubscribe is there to allow peeking into the subscription process and potentially capture the upstream at that point for inspection, i.e., debugging purposes. So do you see the pattern with doOnError etc. now?

    – akarnokd
    Nov 20 '18 at 12:21











  • I didn't see any pattern. I just want to achieve: Any disposable should be captured by compositeDisposable in BaseViewModel so LoginViewModel or any other ViewModel do not need to check for disposing a disposable.

    – Vatish Sharma
    Nov 20 '18 at 12:53











  • Above, I want to capture the disposable in doOnSubscribe method as I was not able to capture it by any other way. Do you have any idea to achieve this ?

    – Vatish Sharma
    Nov 20 '18 at 12:54











  • Why? Save the Disposable returned by the subscribe. There is no reason for you to use doOnSubscribe.

    – akarnokd
    Nov 20 '18 at 13:55











  • Sounds like you already decided. I cannot help you further.

    – akarnokd
    Nov 21 '18 at 8:23
















0















I have a BaseViewModel as:



public class BaseViewModel extends ViewModel {

private MutableLiveData<ApiError> apiError = new MutableLiveData<>();
private MutableLiveData<ApiProgress> apiProgress = new MutableLiveData<>();
private CompositeDisposable compositeDisposable = new CompositeDisposable();

// Emit "progress's start" on subscribe and "progress's end" on after success or error.
// Add this to the observable action sequence with ".compose(baseTransformer())" before subscribe.
<T> SingleTransformer<T, T> baseTransformer() {
return upstream -> upstream
.doOnSubscribe(disposable -> {
Log.d("dis", "doOnSubscribe : " + disposable + " " + disposable.isDisposed());
compositeDisposable.add(disposable);
apiProgress.setValue(ApiProgress.start());
})
.doOnDispose(() -> Log.d("dis", "I am disposed.."))
.doFinally(() -> apiProgress.setValue(ApiProgress.stop()))
.doOnError(err -> {
apiError.setValue(ApiError.create(err));
});
}

public LiveData<ApiError> getApiError() {
return apiError;
}

public LiveData<ApiProgress> getApiProgress() {
return apiProgress;
}

@Override
protected void onCleared() {
super.onCleared();
if (!compositeDisposable.isDisposed()) {
compositeDisposable.dispose();
Log.d("dis", "compositeDisposable disposed");
}
}
}


and a LoginViewModel as:



public class LoginViewModel extends BaseViewModel {

Disposable disposable;
private AuthRepository authRepository;
private MutableLiveData<Login> loginData = new MutableLiveData<>();

public LoginViewModel() {
authRepository = new AuthRepository();
}

public LiveData<Login> getLoginData() {
return loginData;
}

public void login(String userName, String password) {
disposable = authRepository.login(userName, password)
.compose(baseTransformer())
.subscribe(login -> loginData.setValue(login), err -> {
});
}

@Override
protected void onCleared() {
super.onCleared();
Log.d("dis", "LoginViewModel : " + disposable + " " + disposable.isDisposed());
}
}


I want to dispose the disposable returned by subscribe method but I want to do it in transformation function so, I don''t need to do it every time.



I got following output in Logs:



D/dis: doOnSubscribe : null false
D/dis: compositeDisposable disposed
D/dis: LoginViewModel : 0 false


Please help me in understand: why the disposable not disposed even after compositeDisposable disposed successfully.










share|improve this question























  • doOnSubscribe is there to allow peeking into the subscription process and potentially capture the upstream at that point for inspection, i.e., debugging purposes. So do you see the pattern with doOnError etc. now?

    – akarnokd
    Nov 20 '18 at 12:21











  • I didn't see any pattern. I just want to achieve: Any disposable should be captured by compositeDisposable in BaseViewModel so LoginViewModel or any other ViewModel do not need to check for disposing a disposable.

    – Vatish Sharma
    Nov 20 '18 at 12:53











  • Above, I want to capture the disposable in doOnSubscribe method as I was not able to capture it by any other way. Do you have any idea to achieve this ?

    – Vatish Sharma
    Nov 20 '18 at 12:54











  • Why? Save the Disposable returned by the subscribe. There is no reason for you to use doOnSubscribe.

    – akarnokd
    Nov 20 '18 at 13:55











  • Sounds like you already decided. I cannot help you further.

    – akarnokd
    Nov 21 '18 at 8:23














0












0








0








I have a BaseViewModel as:



public class BaseViewModel extends ViewModel {

private MutableLiveData<ApiError> apiError = new MutableLiveData<>();
private MutableLiveData<ApiProgress> apiProgress = new MutableLiveData<>();
private CompositeDisposable compositeDisposable = new CompositeDisposable();

// Emit "progress's start" on subscribe and "progress's end" on after success or error.
// Add this to the observable action sequence with ".compose(baseTransformer())" before subscribe.
<T> SingleTransformer<T, T> baseTransformer() {
return upstream -> upstream
.doOnSubscribe(disposable -> {
Log.d("dis", "doOnSubscribe : " + disposable + " " + disposable.isDisposed());
compositeDisposable.add(disposable);
apiProgress.setValue(ApiProgress.start());
})
.doOnDispose(() -> Log.d("dis", "I am disposed.."))
.doFinally(() -> apiProgress.setValue(ApiProgress.stop()))
.doOnError(err -> {
apiError.setValue(ApiError.create(err));
});
}

public LiveData<ApiError> getApiError() {
return apiError;
}

public LiveData<ApiProgress> getApiProgress() {
return apiProgress;
}

@Override
protected void onCleared() {
super.onCleared();
if (!compositeDisposable.isDisposed()) {
compositeDisposable.dispose();
Log.d("dis", "compositeDisposable disposed");
}
}
}


and a LoginViewModel as:



public class LoginViewModel extends BaseViewModel {

Disposable disposable;
private AuthRepository authRepository;
private MutableLiveData<Login> loginData = new MutableLiveData<>();

public LoginViewModel() {
authRepository = new AuthRepository();
}

public LiveData<Login> getLoginData() {
return loginData;
}

public void login(String userName, String password) {
disposable = authRepository.login(userName, password)
.compose(baseTransformer())
.subscribe(login -> loginData.setValue(login), err -> {
});
}

@Override
protected void onCleared() {
super.onCleared();
Log.d("dis", "LoginViewModel : " + disposable + " " + disposable.isDisposed());
}
}


I want to dispose the disposable returned by subscribe method but I want to do it in transformation function so, I don''t need to do it every time.



I got following output in Logs:



D/dis: doOnSubscribe : null false
D/dis: compositeDisposable disposed
D/dis: LoginViewModel : 0 false


Please help me in understand: why the disposable not disposed even after compositeDisposable disposed successfully.










share|improve this question














I have a BaseViewModel as:



public class BaseViewModel extends ViewModel {

private MutableLiveData<ApiError> apiError = new MutableLiveData<>();
private MutableLiveData<ApiProgress> apiProgress = new MutableLiveData<>();
private CompositeDisposable compositeDisposable = new CompositeDisposable();

// Emit "progress's start" on subscribe and "progress's end" on after success or error.
// Add this to the observable action sequence with ".compose(baseTransformer())" before subscribe.
<T> SingleTransformer<T, T> baseTransformer() {
return upstream -> upstream
.doOnSubscribe(disposable -> {
Log.d("dis", "doOnSubscribe : " + disposable + " " + disposable.isDisposed());
compositeDisposable.add(disposable);
apiProgress.setValue(ApiProgress.start());
})
.doOnDispose(() -> Log.d("dis", "I am disposed.."))
.doFinally(() -> apiProgress.setValue(ApiProgress.stop()))
.doOnError(err -> {
apiError.setValue(ApiError.create(err));
});
}

public LiveData<ApiError> getApiError() {
return apiError;
}

public LiveData<ApiProgress> getApiProgress() {
return apiProgress;
}

@Override
protected void onCleared() {
super.onCleared();
if (!compositeDisposable.isDisposed()) {
compositeDisposable.dispose();
Log.d("dis", "compositeDisposable disposed");
}
}
}


and a LoginViewModel as:



public class LoginViewModel extends BaseViewModel {

Disposable disposable;
private AuthRepository authRepository;
private MutableLiveData<Login> loginData = new MutableLiveData<>();

public LoginViewModel() {
authRepository = new AuthRepository();
}

public LiveData<Login> getLoginData() {
return loginData;
}

public void login(String userName, String password) {
disposable = authRepository.login(userName, password)
.compose(baseTransformer())
.subscribe(login -> loginData.setValue(login), err -> {
});
}

@Override
protected void onCleared() {
super.onCleared();
Log.d("dis", "LoginViewModel : " + disposable + " " + disposable.isDisposed());
}
}


I want to dispose the disposable returned by subscribe method but I want to do it in transformation function so, I don''t need to do it every time.



I got following output in Logs:



D/dis: doOnSubscribe : null false
D/dis: compositeDisposable disposed
D/dis: LoginViewModel : 0 false


Please help me in understand: why the disposable not disposed even after compositeDisposable disposed successfully.







android rx-java rx-android






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 20 '18 at 11:58









Vatish SharmaVatish Sharma

148




148













  • doOnSubscribe is there to allow peeking into the subscription process and potentially capture the upstream at that point for inspection, i.e., debugging purposes. So do you see the pattern with doOnError etc. now?

    – akarnokd
    Nov 20 '18 at 12:21











  • I didn't see any pattern. I just want to achieve: Any disposable should be captured by compositeDisposable in BaseViewModel so LoginViewModel or any other ViewModel do not need to check for disposing a disposable.

    – Vatish Sharma
    Nov 20 '18 at 12:53











  • Above, I want to capture the disposable in doOnSubscribe method as I was not able to capture it by any other way. Do you have any idea to achieve this ?

    – Vatish Sharma
    Nov 20 '18 at 12:54











  • Why? Save the Disposable returned by the subscribe. There is no reason for you to use doOnSubscribe.

    – akarnokd
    Nov 20 '18 at 13:55











  • Sounds like you already decided. I cannot help you further.

    – akarnokd
    Nov 21 '18 at 8:23



















  • doOnSubscribe is there to allow peeking into the subscription process and potentially capture the upstream at that point for inspection, i.e., debugging purposes. So do you see the pattern with doOnError etc. now?

    – akarnokd
    Nov 20 '18 at 12:21











  • I didn't see any pattern. I just want to achieve: Any disposable should be captured by compositeDisposable in BaseViewModel so LoginViewModel or any other ViewModel do not need to check for disposing a disposable.

    – Vatish Sharma
    Nov 20 '18 at 12:53











  • Above, I want to capture the disposable in doOnSubscribe method as I was not able to capture it by any other way. Do you have any idea to achieve this ?

    – Vatish Sharma
    Nov 20 '18 at 12:54











  • Why? Save the Disposable returned by the subscribe. There is no reason for you to use doOnSubscribe.

    – akarnokd
    Nov 20 '18 at 13:55











  • Sounds like you already decided. I cannot help you further.

    – akarnokd
    Nov 21 '18 at 8:23

















doOnSubscribe is there to allow peeking into the subscription process and potentially capture the upstream at that point for inspection, i.e., debugging purposes. So do you see the pattern with doOnError etc. now?

– akarnokd
Nov 20 '18 at 12:21





doOnSubscribe is there to allow peeking into the subscription process and potentially capture the upstream at that point for inspection, i.e., debugging purposes. So do you see the pattern with doOnError etc. now?

– akarnokd
Nov 20 '18 at 12:21













I didn't see any pattern. I just want to achieve: Any disposable should be captured by compositeDisposable in BaseViewModel so LoginViewModel or any other ViewModel do not need to check for disposing a disposable.

– Vatish Sharma
Nov 20 '18 at 12:53





I didn't see any pattern. I just want to achieve: Any disposable should be captured by compositeDisposable in BaseViewModel so LoginViewModel or any other ViewModel do not need to check for disposing a disposable.

– Vatish Sharma
Nov 20 '18 at 12:53













Above, I want to capture the disposable in doOnSubscribe method as I was not able to capture it by any other way. Do you have any idea to achieve this ?

– Vatish Sharma
Nov 20 '18 at 12:54





Above, I want to capture the disposable in doOnSubscribe method as I was not able to capture it by any other way. Do you have any idea to achieve this ?

– Vatish Sharma
Nov 20 '18 at 12:54













Why? Save the Disposable returned by the subscribe. There is no reason for you to use doOnSubscribe.

– akarnokd
Nov 20 '18 at 13:55





Why? Save the Disposable returned by the subscribe. There is no reason for you to use doOnSubscribe.

– akarnokd
Nov 20 '18 at 13:55













Sounds like you already decided. I cannot help you further.

– akarnokd
Nov 21 '18 at 8:23





Sounds like you already decided. I cannot help you further.

– akarnokd
Nov 21 '18 at 8:23












1 Answer
1






active

oldest

votes


















0














I have achieved this goal by adding a new method



<T> void consumeApi(Single<T> apiSingle, Consumer<T> consumer) {
compositeDisposable.add(apiSingle
.compose(baseTransformer())
.subscribe(accept(consumer))
);
}


in BaseViewModel. Now I just need to call



consumeApi(
authRepository.login(userName, password),
login -> loginData.setValue(login)
);


in LoginViewModel.






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392526%2fis-disposable-in-doonsubscribe-method-and-the-disposable-returned-by-subscrib%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    I have achieved this goal by adding a new method



    <T> void consumeApi(Single<T> apiSingle, Consumer<T> consumer) {
    compositeDisposable.add(apiSingle
    .compose(baseTransformer())
    .subscribe(accept(consumer))
    );
    }


    in BaseViewModel. Now I just need to call



    consumeApi(
    authRepository.login(userName, password),
    login -> loginData.setValue(login)
    );


    in LoginViewModel.






    share|improve this answer




























      0














      I have achieved this goal by adding a new method



      <T> void consumeApi(Single<T> apiSingle, Consumer<T> consumer) {
      compositeDisposable.add(apiSingle
      .compose(baseTransformer())
      .subscribe(accept(consumer))
      );
      }


      in BaseViewModel. Now I just need to call



      consumeApi(
      authRepository.login(userName, password),
      login -> loginData.setValue(login)
      );


      in LoginViewModel.






      share|improve this answer


























        0












        0








        0







        I have achieved this goal by adding a new method



        <T> void consumeApi(Single<T> apiSingle, Consumer<T> consumer) {
        compositeDisposable.add(apiSingle
        .compose(baseTransformer())
        .subscribe(accept(consumer))
        );
        }


        in BaseViewModel. Now I just need to call



        consumeApi(
        authRepository.login(userName, password),
        login -> loginData.setValue(login)
        );


        in LoginViewModel.






        share|improve this answer













        I have achieved this goal by adding a new method



        <T> void consumeApi(Single<T> apiSingle, Consumer<T> consumer) {
        compositeDisposable.add(apiSingle
        .compose(baseTransformer())
        .subscribe(accept(consumer))
        );
        }


        in BaseViewModel. Now I just need to call



        consumeApi(
        authRepository.login(userName, password),
        login -> loginData.setValue(login)
        );


        in LoginViewModel.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 21 '18 at 8:31









        Vatish SharmaVatish Sharma

        148




        148
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392526%2fis-disposable-in-doonsubscribe-method-and-the-disposable-returned-by-subscrib%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

            ComboBox Display Member on multiple fields

            Is it possible to collect Nectar points via Trainline?