From 0c92338f621a27b8f68c9e4351bea52649e88b34 Mon Sep 17 00:00:00 2001 From: Kaushik Gopal Date: Sun, 21 Sep 2014 13:39:01 -0700 Subject: [PATCH 001/242] chore: add blog post pointing to intentions for starting of project --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06eddf61..936a76b7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Learning RxJava for Android by example ============== -This is a repository with real-world useful examples of using RxJava with Android. It usually will be in a constant state of "Work in Progress" (WIP). +This is a repository with real-world useful examples of using RxJava with Android. [It usually will be in a constant state of "Work in Progress" (WIP)](http://nerds.weddingpartyapp.com/tech/2014/09/15/learning-rxjava-with-android-by-example/). ## Examples: From 4e6be4106d9c65c528c13c203ae2c1c94a2d7cc8 Mon Sep 17 00:00:00 2001 From: Kaushik Gopal Date: Thu, 2 Oct 2014 11:51:22 -0700 Subject: [PATCH 002/242] chore: upgrade RxJava version from 0.17 -> 0.20.4 --- app/app.iml | 4 ++-- app/build.gradle | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/app.iml b/app/app.iml index 3cd4a48b..3306acd6 100644 --- a/app/app.iml +++ b/app/app.iml @@ -83,7 +83,6 @@ - @@ -91,8 +90,9 @@ + - + diff --git a/app/build.gradle b/app/build.gradle index 84b9f40c..2d319374 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ dependencies { compile 'com.jakewharton:butterknife:5.1.1' compile 'com.jakewharton.timber:timber:2.2.2' - compile 'com.netflix.rxjava:rxjava-android:0.17.+' + compile 'com.netflix.rxjava:rxjava-android:0.20.4' compile 'com.squareup.retrofit:retrofit:1.6.1' compile 'com.squareup.okhttp:okhttp:2.0.0' From 66ceea9d06cf4be7c66c67c463e9264aec548e5e Mon Sep 17 00:00:00 2001 From: Kaushik Gopal Date: Thu, 2 Oct 2014 12:01:20 -0700 Subject: [PATCH 003/242] feat: wiring up example for polling --- .../android/rxjava/MainFragment.java | 9 ++ .../android/rxjava/PollingFragment.java | 111 ++++++++++++++++++ app/src/main/res/layout/fragment_main.xml | 6 + app/src/main/res/layout/fragment_polling.xml | 34 ++++++ app/src/main/res/values/strings.xml | 4 +- 5 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/morihacky/android/rxjava/PollingFragment.java create mode 100644 app/src/main/res/layout/fragment_polling.xml diff --git a/app/src/main/java/com/morihacky/android/rxjava/MainFragment.java b/app/src/main/java/com/morihacky/android/rxjava/MainFragment.java index c7a661ed..1598da77 100644 --- a/app/src/main/java/com/morihacky/android/rxjava/MainFragment.java +++ b/app/src/main/java/com/morihacky/android/rxjava/MainFragment.java @@ -67,6 +67,15 @@ public void demoDoubleBindingWithPublishSubject() { .commit(); } + @OnClick(R.id.btn_demo_polling) + public void demoPolling() { + getActivity().getSupportFragmentManager() + .beginTransaction() + .addToBackStack(this.toString()) + .replace(R.id.activity_main, new PollingFragment(), this.toString()) + .commit(); + } + //@OnClick(R.id.btn_demo_subject_timeout) public void demoTimeout() { getActivity().getSupportFragmentManager() diff --git a/app/src/main/java/com/morihacky/android/rxjava/PollingFragment.java b/app/src/main/java/com/morihacky/android/rxjava/PollingFragment.java new file mode 100644 index 00000000..535f4245 --- /dev/null +++ b/app/src/main/java/com/morihacky/android/rxjava/PollingFragment.java @@ -0,0 +1,111 @@ +package com.morihacky.android.rxjava; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.ListView; +import butterknife.ButterKnife; +import butterknife.InjectView; +import butterknife.OnClick; +import com.morihacky.android.rxjava.app.R; +import java.util.ArrayList; +import java.util.List; +import rx.subscriptions.CompositeSubscription; +import timber.log.Timber; + +public class PollingFragment + extends Fragment { + + @InjectView(R.id.list_threading_log) ListView _logsList; + @InjectView(R.id.btn_start_simple_polling) Button _btnSimplePolling; + + private LogAdapter _adapter; + private List _logs; + private CompositeSubscription _subscriptions; + + @Override + public void onDestroy() { + super.onDestroy(); + _subscriptions.unsubscribe(); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + _setupLogger(); + } + + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View layout = inflater.inflate(R.layout.fragment_polling, container, false); + ButterKnife.inject(this, layout); + return layout; + } + + @OnClick(R.id.btn_start_simple_polling) + public void onStartSimplePollingClicked() { + + } + + + // ----------------------------------------------------------------------------------- + // Method that help wiring up the example (irrelevant to RxJava) + + private void _doSomeLongOperation_thatBlocksCurrentThread() { + _log("performing long operation"); + + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + Timber.d("Operation was interrupted"); + } + } + + private void _log(String logMsg) { + if (_isCurrentlyOnMainThread()) { + _logs.add(0, logMsg + " (main thread) "); + _adapter.clear(); + _adapter.addAll(_logs); + } else { + _logs.add(0, logMsg + " (NOT main thread) "); + + // You can only do below stuff on main thread. + new Handler(Looper.getMainLooper()).post(new Runnable() { + + @Override + public void run() { + _adapter.clear(); + _adapter.addAll(_logs); + } + }); + } + } + + private void _setupLogger() { + _logs = new ArrayList(); + _adapter = new LogAdapter(getActivity(), new ArrayList()); + _logsList.setAdapter(_adapter); + } + + private boolean _isCurrentlyOnMainThread() { + return Looper.myLooper() == Looper.getMainLooper(); + } + + private class LogAdapter + extends ArrayAdapter { + + public LogAdapter(Context context, List logs) { + super(context, R.layout.item_log, R.id.item_log, logs); + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 1678e0d9..8e66e952 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -44,5 +44,11 @@ android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/btn_demo_double_binding_textview"/> + +