a = b + cThe learning curve
"Programar con flujos asincronos de datos"
for (Cat cat : cats) {
Log.i(TAG, cat.getName());
}for (Iterator<Cats> iterator = cats.iterator();
iterator.hasNext();) {
Cat cat = iterator.next();
Log.i(TAG, cat.getName());
}
"La llave está en el acceso a los datos"
Request
Request
Request
Request
Request
729
86
163
84
114
StoryStoryStoryStoryStorystoryObservable729
86
163
84
114
¿Y ahora como accedo a esos datos?
storyObserver.subscribe(new Observer<Story>() {
@Override
public void onCompleted() {}
@Override
public void onNext(Story story) {
Log.i(TAG, story.getTitle());
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
});729
163
Observable.create(new Observable.OnSubscribe<Story>() { //1
@Override
public void call(Subscriber<? super Story> subscriber) {
if (!subscriber.isUnsubscribed()) { //2
try {
Story topStory = hackerNewsRestAdapter
.getTopStory(); //3
subscriber.onNext(topStory); //4
Story newestStory = hackerNewsRestAdapter
.getNewestStory();
subscriber.onNext(newestStory);
subscriber.onCompleted(); //5
} catch (JsonParseException e) {
subscriber.onError(e); //6
}
}
}
});
topStorynewestStorySubscriber implements Observer<Story>Observable.create(new Observable.OnSubscribe<Story>() {
//...
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());729
163
topStorynewestStory729
163
topStorynewestStorychangeColor(circle,Color.RED)
729
86
163
84
114
StoryStoryStoryStoryStoryMap
AuthorAuthorAuthorAuthorAuthorObservable.create(new Observable.OnSubscribe<Story>() {
//Emitting story objects...
})
.map(new Func1<Story, Author>() {
@Override
public Author call(Story story) {
return story.getAuthor();
}
})729
86
163
84
114
StoryStoryStoryStoryStoryflatMap
Observable.create(new Observable.OnSubscribe<Story>() {
//Emitting story objects...
})
.flatMap(new Func1<Story, Observable<Comment>>() {
@Override
public Observable<Comment> call(Story story) {
return Observable.from(story.getComments());
}
})729
86
163
84
114
StoryStoryStoryStoryStoryMap
AuthorAuthorAuthorAuthorAuthorObservable.create(new Observable.OnSubscribe<Story>() {
//Emitting story objects...
})
.map(new Func1<Story, Author>() {
@Override
public Author call(Story story) {
return story.getAuthor();
}
})
.filter(new Func1<Author, Boolean>() {
@Override
public Boolean call(Author author) {
return author.isCage();
}
})Filter
Observable.just(1,2,3,4)
.first()
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.print(integer);
}
});Observable.just(1,2,3,4)
.first()
.subscribe(integer -> {
System.out.print(integer);
});Observable.just(1,2,3,4)
.first()
.subscribe(System.out::print);RxView.clicks(submitButton)
.subscribe(o -> log("submit button clicked!"));RxTextView.textChangeEvents(editText)
.subscribe(e -> log(e.text().toString()));emailChangeObservable = RxTextView.textChangeEvents(email);
passwordChangeObservable = RxTextView.textChangeEvents(password);
// force-disable the button
submitButton.setEnabled(false);
Observable.combineLatest(emailChangeObservable, passwordChangeObservable,
(emailObservable,passwordObservable) -> {
boolean emailCheck = emailObservable.text().length() >= 3;
boolean passwordCheck = passwordObservable.text().length() >= 3;
return emailCheck && passwordCheck;
}).subscribe(aBoolean -> {
submitButton.setEnabled(aBoolean);
});
@GET(SpotifyApiConstants.ARTIST_SEARCH_URL)
Observable<ArtistSearchResponse> searchArtist(
@Query(SpotifyApiConstants.QUERY_TO_SEARCH) String query);@GET(SpotifyApiConstants.ARTIST_SEARCH_URL)
Observable<ArtistSearchResponse> searchArtist(
@Query(SpotifyApiConstants.QUERY_TO_SEARCH) String query);myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);@GET(SpotifyApiConstants.ARTIST_SEARCH_URL)
Observable<ArtistSearchResponse> searchArtist(
@Query(SpotifyApiConstants.QUERY_TO_SEARCH) String query);apiService.searchArtist(query)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<ArtistSearchResponse>() {
@Override
public void call(ArtistSearchResponse artistSearchResponse) {
artistSearchResponse.getArtists();
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
});myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);@GET(SpotifyApiConstants.ARTIST_SEARCH_URL)
Observable<ArtistSearchResponse> searchArtist(
@Query(SpotifyApiConstants.QUERY_TO_SEARCH) String query);apiService.searchArtist(query)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
ArtistSearchResponse::getArtists,
Throwable::printStackTrace);myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);apiService.searchArtist(query)
.observeOn(AndroidSchedulers.mainThread())
.flatMap(artistSearchResponse ->
Observable.from(artistSearchResponse.getArtists()))
.map(artist ->
apiService.getArtistBio(artist.getName()))
.subscribe(bio -> bio.getAutor());Observable.just(geocoder.getFromLocation(latLng.latitude, latLng.longitude))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.filter(addresses -> !addresses.isEmpty())
.flatMap(Observable::from)
.first()
.subscribe(address -> {
callback.addressFound(address);
})silmood
@silmood