Skip to content

Commit 3fbde66

Browse files
committed
Fix issue #1
Don't use observeOn(Schedulers.io()) on "long living" Observables, since Schedulers.io() assigns one dedicated thread for the lifetime of the Observable subscription. Even worse: If nobody evers unsubscribe, you have thread-leaks
1 parent 54e0ac0 commit 3fbde66

File tree

9 files changed

+13
-13
lines changed

9 files changed

+13
-13
lines changed

README.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ link:./src/main/java/ch/petikoch/examples/mvvm_rxjava/example2[]
132132

133133
* A simple form submit of two textfields
134134
* The ViewModel combines the two textfield values into one DTO and calls the Model API on a IO-Thread
135-
* The `RxViewModel2ModelBinder` code does the switch to the `Schedulers.io()` scheduler
135+
* The `RxModelInvoker` code does the switch to the `Schedulers.io()` scheduler
136136

137137
image::example2.png[]
138138

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ apply plugin: 'java'
77
apply plugin: 'eclipse'
88
apply plugin: 'groovy'
99

10-
version = '1.1.1-SNAPSHOT'
10+
version = '1.2.0'
1111

1212
def fileEncoding = 'UTF-8'
1313

src/main/java/ch/petikoch/examples/mvvm_rxjava/example2/Example_2_ViewModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ private void wireInternally() {
4646

4747
@Override
4848
public void connectTo(final Example_2_Model model) {
49-
onEventFrom(vm2m_nameFirstname).execute(model::createAccount);
49+
onEventFrom(vm2m_nameFirstname).executeAsync(model::createAccount);
5050
}
5151

5252
}

src/main/java/ch/petikoch/examples/mvvm_rxjava/example3/Example_3_ViewModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,6 @@ private void wireInternally() {
5454

5555
@Override
5656
public void connectTo(final Example_3_Model model) {
57-
onEventFrom(vm2m_nameFirstname).execute(model::createAccount);
57+
onEventFrom(vm2m_nameFirstname).executeAsync(model::createAccount);
5858
}
5959
}

src/main/java/ch/petikoch/examples/mvvm_rxjava/example4/Example_4_ViewModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ private void wireInternally() {
6363

6464
@Override
6565
public void connectTo(final Example_4_Model model) {
66-
onEventFrom(vm2m_nameFirstname).execute(nameFirstname -> {
66+
onEventFrom(vm2m_nameFirstname).executeAsync(nameFirstname -> {
6767
model.createAccount(nameFirstname);
6868

6969
vm2v_nameEnabled.onNext(true);

src/main/java/ch/petikoch/examples/mvvm_rxjava/example5/Example_5_ViewModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ private void wireInternally() {
7070

7171
@Override
7272
public void connectTo(final Example_5_Model model) {
73-
onEventFrom(vm2m_nameFirstname).execute(nameFirstname -> {
73+
onEventFrom(vm2m_nameFirstname).executeAsync(nameFirstname -> {
7474

7575
Single<Boolean> modelCallFinished = Single.<Boolean>create(singleSubscriber -> {
7676
try {

src/main/java/ch/petikoch/examples/mvvm_rxjava/example5a/Example_5a_ViewModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ private void wireInternally() {
6868

6969
@Override
7070
public void connectTo(final Example_5a_Model model) {
71-
onEventFrom(vm2m_nameFirstname).execute(nameFirstname -> {
71+
onEventFrom(vm2m_nameFirstname).executeAsync(nameFirstname -> {
7272

7373
Single.merge(model.createAccount(nameFirstname), v2vm_cancelButtonEvents.first().toSingle())
7474
.toBlocking()

src/main/java/ch/petikoch/examples/mvvm_rxjava/example6/Example_6_ViewModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private void wireInternally() {
7777

7878
@Override
7979
public void connectTo(final Example_6_Model model) {
80-
onEventFrom(vm2m_nameFirstname).execute(nameFirstname -> {
80+
onEventFrom(vm2m_nameFirstname).executeAsync(nameFirstname -> {
8181

8282
vm2v_resultat1.onNext("Creating acount...");
8383
vm2v_resultat2.onNext("Sending email...");

src/main/java/ch/petikoch/examples/mvvm_rxjava/rxjava_mvvm/RxModelInvoker.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
*/
1616
package ch.petikoch.examples.mvvm_rxjava.rxjava_mvvm;
1717

18+
import ch.petikoch.examples.mvvm_rxjava.utils.AsyncUtils;
1819
import rx.Observable;
1920
import rx.functions.Action1;
20-
import rx.schedulers.Schedulers;
2121

2222
public class RxModelInvoker {
2323

@@ -33,10 +33,10 @@ private ModelInvoker(final Observable<T> source) {
3333
this.source = source;
3434
}
3535

36-
public void execute(final Action1<? super T> onNext) {
37-
source.observeOn(Schedulers.io()).subscribe(onNext);
36+
public void executeAsync(final Action1<? super T> onNext) {
37+
source.subscribe(t -> {
38+
AsyncUtils.executeAsync(() -> onNext.call(t));
39+
});
3840
}
39-
4041
}
41-
4242
}

0 commit comments

Comments
 (0)