From b661f0f3e5efa58f5a6838a9183f5b7d8712a38d Mon Sep 17 00:00:00 2001 From: Mitchell Tilbrook Date: Mon, 25 Jan 2016 00:09:31 +1100 Subject: [PATCH 001/118] fix: finished polling demo --- .../rxjava/fragments/MainFragment.java | 5 + .../rxjava/fragments/PollingFragment.java | 105 +++++++++++++----- app/src/main/res/layout/fragment_main.xml | 5 +- 3 files changed, 86 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/morihacky/android/rxjava/fragments/MainFragment.java b/app/src/main/java/com/morihacky/android/rxjava/fragments/MainFragment.java index 1313f604..b8df6c3e 100644 --- a/app/src/main/java/com/morihacky/android/rxjava/fragments/MainFragment.java +++ b/app/src/main/java/com/morihacky/android/rxjava/fragments/MainFragment.java @@ -53,6 +53,11 @@ void demoRetrofitCalls() { clickedOn(new RetrofitFragment()); } + @OnClick(R.id.btn_demo_polling) + void demoPolling() { + clickedOn(new PollingFragment()); + } + @OnClick(R.id.btn_demo_double_binding_textview) void demoDoubleBindingWithPublishSubject() { clickedOn(new DoubleBindingTextViewFragment()); diff --git a/app/src/main/java/com/morihacky/android/rxjava/fragments/PollingFragment.java b/app/src/main/java/com/morihacky/android/rxjava/fragments/PollingFragment.java index c0a44571..1a588d01 100644 --- a/app/src/main/java/com/morihacky/android/rxjava/fragments/PollingFragment.java +++ b/app/src/main/java/com/morihacky/android/rxjava/fragments/PollingFragment.java @@ -12,6 +12,7 @@ import android.widget.ListView; import com.morihacky.android.rxjava.R; +import com.morihacky.android.rxjava.RxUtils; import java.util.ArrayList; import java.util.List; @@ -21,7 +22,9 @@ import butterknife.ButterKnife; import butterknife.OnClick; import rx.Observable; +import rx.Scheduler; import rx.Subscriber; +import rx.Subscription; import rx.functions.Action0; import rx.functions.Action1; import rx.schedulers.Schedulers; @@ -39,17 +42,14 @@ public class PollingFragment private List _logs; private CompositeSubscription _subscriptions; private int _counter = 0; - - @Override - public void onDestroy() { - super.onDestroy(); - _subscriptions.unsubscribe(); - } + private Scheduler.Worker _worker; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); _subscriptions = new CompositeSubscription(); + _worker = Schedulers.newThread() + .createWorker(); _setupLogger(); } @@ -62,31 +62,82 @@ public View onCreateView(LayoutInflater inflater, return layout; } + @Override + public void onDestroy() { + super.onDestroy(); + RxUtils.unsubscribeIfNotNull(_subscriptions); + ButterKnife.unbind(this); + } + @OnClick(R.id.btn_start_simple_polling) public void onStartSimplePollingClicked() { - _subscriptions.add(Observable.create(new Observable.OnSubscribe() { - @Override - public void call(final Subscriber observer) { - - Schedulers.newThread().createWorker() // - .schedulePeriodically(new Action0() { - @Override - public void call() { - observer.onNext(_doNetworkCallAndGetStringResult()); - } - }, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS); - } - }).take(10).subscribe(new Action1() { - @Override - public void call(String s) { - _log(String.format("String polling - %s", s)); - } - })); + _setupLogger(); + _log(String.format("Simple String polling - %s", _counter)); + _subscriptions.add(Observable.create( + new Observable.OnSubscribe() { + @Override + public void call(final Subscriber subscriber) { + Subscription subscription = _worker + .schedulePeriodically(new Action0() { + @Override + public void call() { + subscriber.onNext(_doNetworkCallAndGetStringResult()); + } + }, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS); + subscriber.add(subscription); + } + }) + .take(10) + .subscribe(new Action1() { + @Override + public void call(String s) { + _log(String.format("String polling - %s", s)); + } + }) + ); + } + + @OnClick(R.id.btn_start_increasingly_delayed_polling) + public void onStartIncreasinglyDelayedPolling() { + _setupLogger(); + _log(String.format("Increasingly delayed String polling - %s", _counter)); + continueIncreasinglyDelayedPolling(1000, 10); } + private void continueIncreasinglyDelayedPolling(final int delay, final int limit) { + _subscriptions = _unsubscribeAndGetNewCompositeSub(_subscriptions); + Observable.create( + new Observable.OnSubscribe() { + @Override + public void call(final Subscriber subscriber) { + + Subscription subscription = _worker.schedule(new Action0() { + @Override + public void call() { + subscriber.onNext(_doNetworkCallAndGetStringResult()); + } + }, delay, TimeUnit.MILLISECONDS); + subscriber.add(subscription); + } + }) + .take(limit) + .subscribe(new Action1() { + @Override + public void call(String s) { + continueIncreasinglyDelayedPolling(delay + 1000, limit - 1); + Timber.d("delay of %d", delay); + _log(String.format("String polling - %s", s)); + } + }); + } // ----------------------------------------------------------------------------------- // Method that help wiring up the example (irrelevant to RxJava) + private static CompositeSubscription _unsubscribeAndGetNewCompositeSub(CompositeSubscription subscription){ + RxUtils.unsubscribeIfNotNull(subscription); + return RxUtils.getNewCompositeSubIfUnsubscribed(subscription); + } + private String _doNetworkCallAndGetStringResult() { try { @@ -120,9 +171,11 @@ public void run() { } private void _setupLogger() { - _logs = new ArrayList(); + _logs = new ArrayList<>(); _adapter = new LogAdapter(getActivity(), new ArrayList()); _logsList.setAdapter(_adapter); + _subscriptions = _unsubscribeAndGetNewCompositeSub(_subscriptions); + _counter = 0; } private boolean _isCurrentlyOnMainThread() { @@ -130,7 +183,7 @@ private boolean _isCurrentlyOnMainThread() { } private class LogAdapter - extends ArrayAdapter { + extends ArrayAdapter { public LogAdapter(Context context, List logs) { super(context, R.layout.item_log, R.id.item_log, logs); diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index aba0cd1d..66fc53f4 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -52,12 +52,11 @@ android:text="@string/btn_demo_double_binding_textview" /> - + android:text="@string/btn_demo_polling" />