Share
Embed
Introduction to RxJava for Android Developers
This talk aims to introduce RxJava and the concepts of Reactive Programming to Android developers. We will focus on the Android world, its challenges and how to tackle them using “reactive” open source libraries like RxAndroid, RxLifecycle and RxBindings.
Marcelo Benites
October 12, 2016
Transcript
103 slides
-
ReactiveX is a combination of the best ideas from the
Observer pattern, the Iterator pattern, and functional programming -
Easily create event streams or data streams. CREATE Compose and
transform streams with query-like operators. COMBINE -
Compose and transform streams with query-like operators. COMBINE Subscribe to
any observable stream to perform side effects. LISTEN Easily create event streams or data streams. CREATE -
public interface Dog { public String getName(); public
boolean isTrained(); } -
public interface Dog { public String getName(); public
boolean isTrained(); } public interface DogHandler { Observable<Dog> trainDogs(); } -
public class John implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.just(new DummyDog("Marley")); } } -
public class John implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.from( Arrays.asList(new DummyDog("Marley"), new DummyDog("Rocky"), new DummyDog("Daisy"))); } } -
public class John implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.fromCallable(() -> { return new DummyDog("Marley"); }); } } -
public class John implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.defer(() -> { return Observable.just(new DummyDog("Marley")); }); } } -
public class John implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.create(new Observable.OnSubscribe<Dog>() { @Override public void call(Subscriber<? super Dog> subscriber) { subscriber.onNext(new DummyDog("Marley")); subscriber.onNext(new DummyDog("Rocky")); subscriber.onCompleted(); } }); } } -
public class John implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.create(new Observable.OnSubscribe<Dog>() { @Override public void call(Subscriber<? super Dog> subscriber) { subscriber.onNext(new DummyDog("Marley")); subscriber.onNext(new DummyDog("Rocky")); subscriber.onCompleted(); } }); } } -
public class John implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.from( Arrays.asList(new DummyDog("Marley"), new DummyDog("Rocky"), new DummyDog("Daisy"))); } } -
public class John implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.from( Arrays.asList(new DummyDog("Marley"), new DummyDog("Rocky"), new DummyDog("Daisy"))) .map(dummyDog -> trainDog(dummyDog)); } private Dog trainDog(Dog dog) { return new TrainedDog(dog.getName()); } } -
public class John implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.from( Arrays.asList(new DummyDog("Marley"), new DummyDog("Rocky"), new DummyDog("Daisy"))) .map(dummyDog -> trainDog(dummyDog)); } private Dog trainDog(Dog dog) { return new TrainedDog(dog.getName()); } } -
public class John implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.from( Arrays.asList(new DummyDog("Marley"), new DummyDog("Rocky"), new DummyDog(“Daisy"))) .filter(dummyDog -> !dummyDog.getName().equals(“Rocky")) .map(dummyDog -> trainDog(dummyDog)); } private Dog trainDog(Dog dog) { return new TrainedDog(dog.getName()); } } -
public class Mary implements DogHandler { @Override public Observable<Dog>
trainDogs() { return Observable.just(new DummyDog("Rocky")) .map(dummyDog -> trainDog(dummyDog)); } private Dog trainDog(Dog dog) { return new TrainedDog(dog.getName()); } } -
DogHandler john = DogHandlerFactory.get(DogHandlerFactory.JOHN); DogHandler mary = DogHandlerFactory.get(DogHandlerFactory.MARY); Observable<Dog>
trainedDogs = Observable.merge(john.trainDogs(), mary.trainDogs()); -
DogHandler john = DogHandlerFactory.get(DogHandlerFactory.JOHN); DogHandler mary = DogHandlerFactory.get(DogHandlerFactory.MARY); Observable<Dog>
trainedDogs = Observable.concat(john.trainDogs(), mary.trainDogs()); -
public class John implements DogHandler { private final DogRepository
dogRepository; public John(DogRepository dogRepository) { this.dogRepository = dogRepository; } @Override public Observable<Dog> trainDogs() { return dogRepository.storedDogs() .filter(storedDog -> (!storedDog.isTrained() && !storedDog.getName().equals(“Rocky"))) .map(dummyDog -> trainDog(dummyDog)); } private Dog trainDog(Dog dummyDog) { return new TrainedDog(dummyDog.getName()); } } -
DogHandler john = DogHandlerFactory.get(DogHandlerFactory.JOHN); DogHandler mary = DogHandlerFactory.get(DogHandlerFactory.MARY); Observable<Dog>
trainedDogs = Observable.concat(john.trainDogs(), mary.trainDogs()); -
DogHandler john = DogHandlerFactory.get(DogHandlerFactory.JOHN); DogHandler mary = DogHandlerFactory.get(DogHandlerFactory.MARY); Observable<Dog>
trainedDogs = Observable.concat(john.trainDogs().take(3), mary.trainDogs()); -
Button button = (Button) findViewById(R.id.button); DogHandler john = DogHandlerFactory.get(DogHandlerFactory.JOHN);
Observable<Dog> trainedDogs = RxView.clicks(button).flatMap(click -> john.trainDogs()); -
Button button = (Button) findViewById(R.id.button); DogHandler john = DogHandlerFactory.get(DogHandlerFactory.JOHN);
Observable<Dog> trainedDogs = RxView.clicks(button).concatMap(click -> john.trainDogs()); -
trainedDogs.subscribe(new Observer<Dog>() { @Override public void onCompleted() { }
@Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
Subscription subscription = trainedDogs .subscribe(new Observer<Dog>() { @Override public void
onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
@Override protected void onResume() { super.onResume(); trainedDogs .compose(bindToLifecycle()) .subscribe(new Observer<Dog>()
{ @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); } -
@Override protected void onResume() { super.onResume(); trainedDogs .compose(bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new Observer<Dog>()
{ @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); } -
RxAppCompatActivity view = MainActivity.this; view.lifecycle() .filter(activityEvent -> activityEvent.equals(ActivityEvent.RESUME)) .flatMap(resume ->
john.trainDogs()) .compose(view.bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
RxAppCompatActivity view = MainActivity.this; view.lifecycle() .filter(activityEvent -> activityEvent.equals(ActivityEvent.RESUME)) .flatMap(resume ->
john.trainDogs()) .compose(view.bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
RxAppCompatActivity view = MainActivity.this; view.lifecycle() .filter(activityEvent -> activityEvent.equals(ActivityEvent.RESUME)) .flatMap(resume ->
john.trainDogs()) .compose(view.bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
RxAppCompatActivity view = MainActivity.this; view.lifecycle() .filter(activityEvent -> activityEvent.equals(ActivityEvent.RESUME)) .flatMap(resume ->
john.trainDogs()) .compose(view.bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
RxAppCompatActivity view = MainActivity.this; view.lifecycle() .filter(activityEvent -> activityEvent.equals(ActivityEvent.RESUME)) .flatMap(resume ->
john.trainDogs()) .compose(view.bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
RxAppCompatActivity view = MainActivity.this; view.lifecycle() .filter(activityEvent -> activityEvent.equals(ActivityEvent.RESUME)) .flatMap(resume ->
john.trainDogs()) .compose(view.bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
RxAppCompatActivity view = MainActivity.this; view.lifecycle() .filter(activityEvent -> activityEvent.equals(ActivityEvent.RESUME)) .compose(view.bindUntilEvent(ActivityEvent.DESTROY)) .flatMap(resume
-> john.trainDogs()) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
RxAppCompatActivity view = MainActivity.this; view.lifecycle() .filter(activityEvent -> activityEvent.equals(ActivityEvent.RESUME)) .compose(view.bindUntilEvent(ActivityEvent.DESTROY)) .flatMap(resume
-> john.trainDogs()) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
public class John implements DogHandler { private final DogWebService
dogWebService; public John(DogWebService dogWebService) { this.dogWebService = dogWebService; } @Override public Observable<Dog> trainDogs() { return Observable.fromCallable(() -> { return dogWebService.getDog(); }) .map(dummyDog -> trainDog(dummyDog)); } private Dog trainDog(Dog dummyDog) { return new TrainedDog(dummyDog.getName()); } } -
@Override public Observable<Dog> trainDogs() { return Observable.fromCallable(() -> { return
dogWebService.getDog(); }) .map(dummyDog -> trainDog(dummyDog)) .subscribeOn(Schedulers.io()); } -
@Override public Observable<Dog> trainDogs() { return Observable.fromCallable(() -> { return
dogWebService.getDog(); }) .map(dummyDog -> trainDog(dummyDog)) .subscribeOn(Schedulers.io()); } -
@Override public Observable<Dog> trainDogs() { return Observable.fromCallable(() -> { return
dogWebService.getDog(); }) .map(dummyDog -> trainDog(dummyDog)) .subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.computation()); } -
@Override public Observable<Dog> trainDogs() { return Observable.fromCallable(() -> { return
dogWebService.getDog(); }) .map(dummyDog -> trainDog(dummyDog)) .subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.computation()); } -
final TextView text = (TextView) findViewById(R.id.text); john.trainDogs() .subscribe(new Observer<Dog>()
{ @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { text.setText(dog.getName()); } }); -
final TextView text = (TextView) findViewById(R.id.text); john.trainDogs() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new
Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { text.setText(dog.getName()); } }); -
final TextView text = (TextView) findViewById(R.id.text); john.trainDogs() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new
Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { text.setText(dog.getName()); } }); -
final TextView text = (TextView) findViewById(R.id.text); john.trainDogs() .observeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io())
.subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { text.setText(dog.getName()); } }); -
final TextView text = (TextView) findViewById(R.id.text); john.trainDogs() .observeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io())
.subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { text.setText(dog.getName()); } }); -
final TextView text = (TextView) findViewById(R.id.text); john.trainDogs() .observeOn(AndroidSchedulers.mainThread()) .doOnNext(trainedDog
-> text.setText(trainedDog.getName())) .observeOn(Schedulers.io()) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { text.setText(dog.getName()); } }); -
final TextView text = (TextView) findViewById(R.id.text); john.trainDogs() .observeOn(AndroidSchedulers.mainThread()) .doOnNext(trainedDog
-> text.setText(trainedDog.getName())) .observeOn(Schedulers.io()) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { text.setText(dog.getName()); } }); -
final TextView text = (TextView) findViewById(R.id.text); john.trainDogs() .observeOn(AndroidSchedulers.mainThread()) .doOnNext(trainedDog
-> text.setText(trainedDog.getName())) .delay(5, TimeUnit.SECONDS) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { text.setText(dog.getName()); } }); -
final TextView text = (TextView) findViewById(R.id.text); john.trainDogs() .observeOn(AndroidSchedulers.mainThread()) .doOnNext(trainedDog
-> text.setText(trainedDog.getName())) .delay(5, TimeUnit.SECONDS) .subscribe(new Observer<Dog>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { text.setText(dog.getName()); } }); -
john.trainDogs() .subscribe(new Observer<Dog>() { @Override public void onCompleted() {
} @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
john.trainDogs() .subscribe(new Observer<Dog>() { @Override public void onCompleted() {
} @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } }); -
john.trainDogs() .subscribe(new Observer<Dog>() { @Override public void onCompleted() {
} @Override public void onError(Throwable e) { } @Override public void onNext(Dog dog) { } });