Is disposable in “doOnSubscribe” method and the disposable returned by “subscribe” method are...
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
add a comment |
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
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 withdoOnError
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 bycompositeDisposable
inBaseViewModel
soLoginViewModel
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 thedisposable
indoOnSubscribe
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 theDisposable
returned by thesubscribe
. There is no reason for you to usedoOnSubscribe
.
– akarnokd
Nov 20 '18 at 13:55
Sounds like you already decided. I cannot help you further.
– akarnokd
Nov 21 '18 at 8:23
add a comment |
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
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
android rx-java rx-android
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 withdoOnError
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 bycompositeDisposable
inBaseViewModel
soLoginViewModel
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 thedisposable
indoOnSubscribe
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 theDisposable
returned by thesubscribe
. There is no reason for you to usedoOnSubscribe
.
– akarnokd
Nov 20 '18 at 13:55
Sounds like you already decided. I cannot help you further.
– akarnokd
Nov 21 '18 at 8:23
add a comment |
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 withdoOnError
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 bycompositeDisposable
inBaseViewModel
soLoginViewModel
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 thedisposable
indoOnSubscribe
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 theDisposable
returned by thesubscribe
. There is no reason for you to usedoOnSubscribe
.
– 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
add a comment |
1 Answer
1
active
oldest
votes
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.
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
add a comment |
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.
add a comment |
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.
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.
answered Nov 21 '18 at 8:31
Vatish SharmaVatish Sharma
148
148
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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 withdoOnError
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
inBaseViewModel
soLoginViewModel
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
indoOnSubscribe
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 thesubscribe
. There is no reason for you to usedoOnSubscribe
.– akarnokd
Nov 20 '18 at 13:55
Sounds like you already decided. I cannot help you further.
– akarnokd
Nov 21 '18 at 8:23