Last active
February 23, 2017 11:14
-
-
Save joshskeen/0b4a26e3b3d2b01e7130 to your computer and use it in GitHub Desktop.
nested webservice calls: RxJava vs Callbacks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.joshskeen.rxjava_example.model; | |
import java.util.ArrayList; | |
import java.util.List; | |
import de.greenrobot.event.EventBus; | |
import retrofit.Callback; | |
import retrofit.RetrofitError; | |
import retrofit.client.Response; | |
import rx.Observable; | |
import timber.log.Timber; | |
public class GithubServiceManager { | |
private GithubService mService; | |
private EventBus mBus; | |
public GithubServiceManager() { | |
mService = GithubService.getInstance(); | |
mBus = EventBus.getDefault(); | |
} | |
//The "Nested Callbacks" Way | |
public void fetchUserDetails() { | |
//first, request the users... | |
mService.requestUsers(new Callback<GithubUsersResponse>() { | |
@Override | |
public void success(final GithubUsersResponse githubUsersResponse, | |
final Response response) { | |
Timber.i("Request Users request completed"); | |
final List<GithubUserDetail> githubUserDetails = new ArrayList<GithubUserDetail>(); | |
//next, loop over each item in the response | |
for (GithubUserDetail githubUserDetail : githubUserDetails) { | |
//request a detail object for that user | |
mService.requestUserDetails(githubUserDetail.mLogin, | |
new Callback<GithubUserDetail>() { | |
@Override | |
public void success(GithubUserDetail githubUserDetail, | |
Response response) { | |
Timber.i("User Detail request completed for user : " + githubUserDetail.mLogin); | |
githubUserDetails.add(githubUserDetail); | |
if (githubUserDetails.size() == githubUsersResponse.mGithubUsers.size()) { | |
//we've downloaded'em all - notify all who are interested! | |
mBus.post(new UserDetailsLoadedCompleteEvent(githubUserDetails)); | |
} | |
} | |
@Override | |
public void failure(RetrofitError error) { | |
Timber.e("Request User Detail Failed!!!!", error); | |
} | |
}); | |
} | |
} | |
@Override | |
public void failure(RetrofitError error) { | |
Timber.e("Request User Failed!!!!", error); | |
} | |
}); | |
} | |
//The RXJava Way | |
public void rxFetchUserDetails() { | |
//request the users | |
mService.rxRequestUsers().concatMap(Observable::from) | |
.concatMap((GithubUser githubUser) -> | |
//request the details for each user | |
mService.rxRequestUserDetails(githubUser.mLogin) | |
) | |
//accumulate them as a list | |
.toList() | |
.subscribeOn(Schedulers.newThread()) | |
.observeOn(AndroidSchedulers.mainThread()) | |
//post them on the eventbus | |
.subscribe(githubUserDetails -> { | |
EventBus.getDefault().post(new UserDetailsLoadedCompleteEvent(githubUserDetails)); | |
}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment