Skip to content

Commit 9b79441

Browse files
author
Kaushik Gopal
committed
feat: port Retrofit related examples
* port example Networking with Retrofit & RxJava (using zip, flatmap) * port example Networking with Retrofit & RxJava (side by side with AsyncTask) * port example Pseudo caching : retrieve data first from a cache, then a network call (using concat, concatEager, merge or publish) * port example Pseudo caching : old merge e.g. with result age strategy Merge branch 'marcinkunert-feat/rxjava_2' into feat/rxjava_2 * marcinkunert-feat/rxjava_2: Replaced RxJava1 retrofit adapter with the RxJava2 version Updated RxJava to 2.0.1 Added packagingOptions so RxJava 1 and RxJava 2 can work on the same project Adjusted retrofit related examples Updated retrofit setup to return RxJava2 observables. fix: link for orchestrating observables fix: readme update links chore: update README + table of contents for e.g.s
2 parents 9b2a17a + 5f78f0a commit 9b79441

File tree

8 files changed

+161
-125
lines changed

8 files changed

+161
-125
lines changed

README.md

Lines changed: 86 additions & 60 deletions
Large diffs are not rendered by default.

app/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,20 @@ dependencies {
4141
// ----------- Rx dependencies
4242

4343
compile 'io.reactivex:rxjava:1.1.4'
44-
compile 'io.reactivex.rxjava2:rxjava:2.0.0'
44+
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
4545

4646
// Because RxAndroid releases are few and far between, it is recommended you also
4747
// explicitly depend on RxJava's latest version for bug fixes and new features.
4848
compile 'io.reactivex:rxandroid:1.2.0'
49-
compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
49+
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
5050

5151
// libs like rxbinding + rxjava-math haven't been ported to RxJava 2.x yet, so this helps
5252
compile "com.github.akarnokd:rxjava2-interop:0.6.1"
5353

5454
compile 'io.reactivex:rxjava-math:1.0.0'
5555
compile 'com.jakewharton.rxrelay:rxrelay:1.2.0'
5656
compile 'com.jakewharton.rxbinding:rxbinding:0.2.0'
57-
compile "com.squareup.retrofit2:adapter-rxjava:${retrofitVersion}"
57+
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
5858

5959

6060
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'

app/src/main/java/com/morihacky/android/rxjava/fragments/PseudoCacheFragment.java

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,25 @@
1010
import android.widget.ArrayAdapter;
1111
import android.widget.ListView;
1212
import android.widget.TextView;
13-
import butterknife.Bind;
14-
import butterknife.ButterKnife;
15-
import butterknife.OnClick;
13+
1614
import com.morihacky.android.rxjava.R;
1715
import com.morihacky.android.rxjava.retrofit.Contributor;
1816
import com.morihacky.android.rxjava.retrofit.GithubApi;
1917
import com.morihacky.android.rxjava.retrofit.GithubService;
18+
2019
import java.util.ArrayList;
2120
import java.util.HashMap;
2221
import java.util.List;
2322
import java.util.Map;
2423
import java.util.concurrent.TimeUnit;
25-
import rx.Observable;
26-
import rx.Subscriber;
27-
import rx.android.schedulers.AndroidSchedulers;
28-
import rx.schedulers.Schedulers;
24+
25+
import butterknife.Bind;
26+
import butterknife.ButterKnife;
27+
import butterknife.OnClick;
28+
import io.reactivex.Observable;
29+
import io.reactivex.android.schedulers.AndroidSchedulers;
30+
import io.reactivex.observers.DisposableObserver;
31+
import io.reactivex.schedulers.Schedulers;
2932
import timber.log.Timber;
3033

3134
public class PseudoCacheFragment
@@ -61,9 +64,9 @@ public void onConcatBtnClicked() {
6164
Observable.concat(getSlowCachedDiskData(), getFreshNetworkData())
6265
.subscribeOn(Schedulers.io()) // we want to add a list item at time of subscription
6366
.observeOn(AndroidSchedulers.mainThread())
64-
.subscribe(new Subscriber<Contributor>() {
67+
.subscribe(new DisposableObserver<Contributor>() {
6568
@Override
66-
public void onCompleted() {
69+
public void onComplete() {
6770
Timber.d("done loading all data");
6871
}
6972

@@ -86,12 +89,16 @@ public void onConcatEagerBtnClicked() {
8689
infoText.setText(R.string.msg_pseudoCache_demoInfo_concatEager);
8790
wireupDemo();
8891

89-
Observable.concatEager(getSlowCachedDiskData(), getFreshNetworkData())
92+
List<Observable<Contributor>> observables = new ArrayList<>(2);
93+
observables.add(getSlowCachedDiskData());
94+
observables.add(getFreshNetworkData());
95+
96+
Observable.concatEager(observables)
9097
.subscribeOn(Schedulers.io()) // we want to add a list item at time of subscription
9198
.observeOn(AndroidSchedulers.mainThread())
92-
.subscribe(new Subscriber<Contributor>() {
99+
.subscribe(new DisposableObserver<Contributor>() {
93100
@Override
94-
public void onCompleted() {
101+
public void onComplete() {
95102
Timber.d("done loading all data");
96103
}
97104

@@ -118,9 +125,9 @@ public void onMergeBtnClicked() {
118125
Observable.merge(getCachedDiskData(), getFreshNetworkData())
119126
.subscribeOn(Schedulers.io()) // we want to add a list item at time of subscription
120127
.observeOn(AndroidSchedulers.mainThread())
121-
.subscribe(new Subscriber<Contributor>() {
128+
.subscribe(new DisposableObserver<Contributor>() {
122129
@Override
123-
public void onCompleted() {
130+
public void onComplete() {
124131
Timber.d("done loading all data");
125132
}
126133

@@ -146,9 +153,9 @@ public void onMergeSlowBtnClicked() {
146153
Observable.merge(getSlowCachedDiskData(), getFreshNetworkData())
147154
.subscribeOn(Schedulers.io()) // we want to add a list item at time of subscription
148155
.observeOn(AndroidSchedulers.mainThread())
149-
.subscribe(new Subscriber<Contributor>() {
156+
.subscribe(new DisposableObserver<Contributor>() {
150157
@Override
151-
public void onCompleted() {
158+
public void onComplete() {
152159
Timber.d("done loading all data");
153160
}
154161

@@ -177,9 +184,9 @@ public void onMergeOptimizedBtnClicked() {
177184
getCachedDiskData().takeUntil(network)))
178185
.subscribeOn(Schedulers.io()) // we want to add a list item at time of subscription
179186
.observeOn(AndroidSchedulers.mainThread())
180-
.subscribe(new Subscriber<Contributor>() {
187+
.subscribe(new DisposableObserver<Contributor>() {
181188
@Override
182-
public void onCompleted() {
189+
public void onComplete() {
183190
Timber.d("done loading all data");
184191
}
185192

@@ -208,9 +215,9 @@ public void onMergeOptimizedWithSlowDiskBtnClicked() {
208215
getSlowCachedDiskData().takeUntil(network)))
209216
.subscribeOn(Schedulers.io()) // we want to add a list item at time of subscription
210217
.observeOn(AndroidSchedulers.mainThread())
211-
.subscribe(new Subscriber<Contributor>() {
218+
.subscribe(new DisposableObserver<Contributor>() {
212219
@Override
213-
public void onCompleted() {
220+
public void onComplete() {
214221
Timber.d("done loading all data");
215222
}
216223

@@ -259,10 +266,10 @@ private Observable<Contributor> getCachedDiskData() {
259266
list.add(c);
260267
}
261268

262-
return Observable.from(list)//
263-
.doOnSubscribe(() -> new Handler(Looper.getMainLooper())//
269+
return Observable.fromIterable(list)//
270+
.doOnSubscribe((data) -> new Handler(Looper.getMainLooper())//
264271
.post(() -> adapterSubscriptionInfo.add("(disk) cache subscribed")))//
265-
.doOnCompleted(() -> new Handler(Looper.getMainLooper())//
272+
.doOnComplete(() -> new Handler(Looper.getMainLooper())//
266273
.post(() -> adapterSubscriptionInfo.add("(disk) cache completed")));
267274
}
268275

@@ -271,10 +278,10 @@ private Observable<Contributor> getFreshNetworkData() {
271278
GithubApi githubService = GithubService.createGithubService(githubToken);
272279

273280
return githubService.contributors("square", "retrofit")
274-
.flatMap(Observable::from)
275-
.doOnSubscribe(() -> new Handler(Looper.getMainLooper())//
281+
.flatMap(Observable::fromIterable)
282+
.doOnSubscribe((data) -> new Handler(Looper.getMainLooper())//
276283
.post(() -> adapterSubscriptionInfo.add("(network) subscribed")))//
277-
.doOnCompleted(() -> new Handler(Looper.getMainLooper())//
284+
.doOnComplete(() -> new Handler(Looper.getMainLooper())//
278285
.post(() -> adapterSubscriptionInfo.add("(network) completed")));
279286
}
280287

app/src/main/java/com/morihacky/android/rxjava/fragments/PseudoCacheMergeFragment.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,23 @@
88
import android.view.ViewGroup;
99
import android.widget.ArrayAdapter;
1010
import android.widget.ListView;
11-
import butterknife.Bind;
12-
import butterknife.ButterKnife;
13-
import butterknife.OnClick;
11+
1412
import com.morihacky.android.rxjava.R;
1513
import com.morihacky.android.rxjava.retrofit.Contributor;
1614
import com.morihacky.android.rxjava.retrofit.GithubApi;
1715
import com.morihacky.android.rxjava.retrofit.GithubService;
16+
1817
import java.util.ArrayList;
1918
import java.util.HashMap;
2019
import java.util.List;
21-
import rx.Observable;
22-
import rx.Subscriber;
23-
import rx.android.schedulers.AndroidSchedulers;
24-
import rx.schedulers.Schedulers;
20+
21+
import butterknife.Bind;
22+
import butterknife.ButterKnife;
23+
import butterknife.OnClick;
24+
import io.reactivex.Observable;
25+
import io.reactivex.android.schedulers.AndroidSchedulers;
26+
import io.reactivex.observers.DisposableObserver;
27+
import io.reactivex.schedulers.Schedulers;
2528
import timber.log.Timber;
2629

2730
public class PseudoCacheMergeFragment
@@ -59,9 +62,9 @@ public void onDemoPseudoCacheClicked() {
5962
Observable.merge(_getCachedData(), _getFreshData())
6063
.subscribeOn(Schedulers.io())
6164
.observeOn(AndroidSchedulers.mainThread())
62-
.subscribe(new Subscriber<Pair<Contributor, Long>>() {
65+
.subscribe(new DisposableObserver<Pair<Contributor,Long>>() {
6366
@Override
64-
public void onCompleted() {
67+
public void onComplete() {
6568
Timber.d("done loading all data");
6669
}
6770

@@ -114,15 +117,15 @@ private Observable<Pair<Contributor, Long>> _getCachedData() {
114117
list.add(dataWithAgePair);
115118
}
116119

117-
return Observable.from(list);
120+
return Observable.fromIterable(list);
118121
}
119122

120123
private Observable<Pair<Contributor, Long>> _getFreshData() {
121124
String githubToken = getResources().getString(R.string.github_oauth_token);
122125
GithubApi githubService = GithubService.createGithubService(githubToken);
123126

124127
return githubService.contributors("square", "retrofit")
125-
.flatMap(Observable::from)
128+
.flatMap(Observable::fromIterable)
126129
.map(contributor -> new Pair<>(contributor, System.currentTimeMillis()));
127130
}
128131

app/src/main/java/com/morihacky/android/rxjava/fragments/RetrofitAsyncTaskDeathFragment.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
import butterknife.Bind;
2222
import butterknife.ButterKnife;
2323
import butterknife.OnClick;
24-
import rx.Observer;
25-
import rx.android.schedulers.AndroidSchedulers;
26-
import rx.schedulers.Schedulers;
24+
import io.reactivex.android.schedulers.AndroidSchedulers;
25+
import io.reactivex.observers.DisposableObserver;
26+
import io.reactivex.schedulers.Schedulers;
2727

2828
import static java.lang.String.format;
2929

@@ -89,9 +89,9 @@ protected void onPostExecute(User user) {
8989
_githubService.user(_username.getText().toString())
9090
.subscribeOn(Schedulers.io())
9191
.observeOn(AndroidSchedulers.mainThread())
92-
.subscribe(new Observer<User>() {
92+
.subscribe(new DisposableObserver<User>() {
9393
@Override
94-
public void onCompleted() {
94+
public void onComplete() {
9595
}
9696

9797
@Override

app/src/main/java/com/morihacky/android/rxjava/fragments/RetrofitFragment.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,11 @@
2323
import butterknife.Bind;
2424
import butterknife.ButterKnife;
2525
import butterknife.OnClick;
26-
import rx.Observable;
27-
import rx.Observer;
28-
import rx.Subscriber;
29-
import rx.android.schedulers.AndroidSchedulers;
30-
import rx.schedulers.Schedulers;
31-
import rx.subscriptions.CompositeSubscription;
26+
import io.reactivex.Observable;
27+
import io.reactivex.android.schedulers.AndroidSchedulers;
28+
import io.reactivex.disposables.CompositeDisposable;
29+
import io.reactivex.observers.DisposableObserver;
30+
import io.reactivex.schedulers.Schedulers;
3231
import timber.log.Timber;
3332

3433
import static android.text.TextUtils.isEmpty;
@@ -43,15 +42,15 @@ public class RetrofitFragment
4342

4443
private ArrayAdapter<String> _adapter;
4544
private GithubApi _githubService;
46-
private CompositeSubscription _subscriptions;
45+
private CompositeDisposable _disposables;
4746

4847
@Override
4948
public void onCreate(Bundle savedInstanceState) {
5049
super.onCreate(savedInstanceState);
5150
String githubToken = getResources().getString(R.string.github_oauth_token);
5251
_githubService = GithubService.createGithubService(githubToken);
5352

54-
_subscriptions = new CompositeSubscription();
53+
_disposables = new CompositeDisposable();
5554
}
5655

5756
@Override
@@ -78,20 +77,21 @@ public void onDestroyView() {
7877
@Override
7978
public void onDestroy() {
8079
super.onDestroy();
81-
_subscriptions.unsubscribe();
80+
_disposables.dispose();
8281
}
8382

8483
@OnClick(R.id.btn_demo_retrofit_contributors)
8584
public void onListContributorsClicked() {
8685
_adapter.clear();
8786

88-
_subscriptions.add(//
87+
_disposables.add(//
8988
_githubService.contributors(_username.getText().toString(), _repo.getText().toString())
9089
.subscribeOn(Schedulers.io())
9190
.observeOn(AndroidSchedulers.mainThread())
92-
.subscribe(new Observer<List<Contributor>>() {
91+
.subscribeWith(new DisposableObserver<List<Contributor>>() {
92+
9393
@Override
94-
public void onCompleted() {
94+
public void onComplete() {
9595
Timber.d("Retrofit call 1 completed");
9696
}
9797

@@ -121,8 +121,8 @@ public void onNext(List<Contributor> contributors) {
121121
public void onListContributorsWithFullUserInfoClicked() {
122122
_adapter.clear();
123123

124-
_subscriptions.add(_githubService.contributors(_username.getText().toString(), _repo.getText().toString())
125-
.flatMap(Observable::from)
124+
_disposables.add(_githubService.contributors(_username.getText().toString(), _repo.getText().toString())
125+
.flatMap(Observable::fromIterable)
126126
.flatMap(contributor -> {
127127
Observable<User> _userObservable = _githubService.user(contributor.login)
128128
.filter(user -> !isEmpty(user.name) && !isEmpty(user.email));
@@ -133,9 +133,9 @@ public void onListContributorsWithFullUserInfoClicked() {
133133
})
134134
.subscribeOn(Schedulers.newThread())
135135
.observeOn(AndroidSchedulers.mainThread())
136-
.subscribe(new Subscriber<Pair>() {
136+
.subscribeWith(new DisposableObserver<Pair<User,Contributor>>() {
137137
@Override
138-
public void onCompleted() {
138+
public void onComplete() {
139139
Timber.d("Retrofit call 2 completed ");
140140
}
141141

app/src/main/java/com/morihacky/android/rxjava/retrofit/GithubApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import java.util.List;
44

5+
import io.reactivex.Observable;
56
import retrofit2.http.GET;
67
import retrofit2.http.Path;
7-
import rx.Observable;
88

99
public interface GithubApi {
1010

app/src/main/java/com/morihacky/android/rxjava/retrofit/GithubService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
import android.text.TextUtils;
44

5+
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
6+
57
import okhttp3.OkHttpClient;
68
import okhttp3.Request;
7-
import okhttp3.Response;
89
import retrofit2.Retrofit;
9-
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
1010
import retrofit2.converter.gson.GsonConverterFactory;
1111

1212
import static java.lang.String.format;
@@ -17,7 +17,7 @@ private GithubService() {
1717
}
1818

1919
public static GithubApi createGithubService(final String githubToken) {
20-
Retrofit.Builder builder = new Retrofit.Builder().addCallAdapterFactory(RxJavaCallAdapterFactory.create())
20+
Retrofit.Builder builder = new Retrofit.Builder().addCallAdapterFactory(RxJava2CallAdapterFactory.create())
2121
.addConverterFactory(GsonConverterFactory.create())
2222
.baseUrl("https://api.github.com");
2323

0 commit comments

Comments
 (0)