From 9f4f222a62cec6f1465f12137e63ddcb74817974 Mon Sep 17 00:00:00 2001 From: Kaushik Gopal Date: Tue, 2 Jun 2015 11:20:35 -0700 Subject: [PATCH 001/190] refactor: .create() -> .just() : create is an overkill --- ...ConcurrencyWithSchedulersDemoFragment.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/morihacky/android/rxjava/ConcurrencyWithSchedulersDemoFragment.java b/app/src/main/java/com/morihacky/android/rxjava/ConcurrencyWithSchedulersDemoFragment.java index 15f33371..290ea2d7 100644 --- a/app/src/main/java/com/morihacky/android/rxjava/ConcurrencyWithSchedulersDemoFragment.java +++ b/app/src/main/java/com/morihacky/android/rxjava/ConcurrencyWithSchedulersDemoFragment.java @@ -14,15 +14,14 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import com.morihacky.android.rxjava.R; import java.util.ArrayList; import java.util.List; import rx.Observable; import rx.Observer; -import rx.Subscriber; import rx.Subscription; import rx.android.app.AppObservable; import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; import rx.schedulers.Schedulers; import timber.log.Timber; @@ -72,23 +71,17 @@ public void startLongOperation() { } private Observable _getObservable() { - return Observable.create(new Observable.OnSubscribe() { - + return Observable.just(true).map(new Func1() { @Override - public void call(Subscriber observer) { - - _log("Within Observable"); - + public Boolean call(Boolean aBoolean) { _doSomeLongOperation_thatBlocksCurrentThread(); - observer.onNext(true); - observer.onCompleted(); + return aBoolean; } }); } /** - * Observer that handles the result List from Observable - * through the 3 important actions: + * Observer that handles the result through the 3 important actions: * * 1. onCompleted * 2. onError @@ -106,13 +99,13 @@ public void onCompleted() { @Override public void onError(Throwable e) { Timber.e(e, "Error in RxJava Demo concurrency"); - _log(String.format("Boo Error %s", e.getMessage())); + _log(String.format("Boo! Error %s", e.getMessage())); _progress.setVisibility(View.INVISIBLE); } @Override - public void onNext(Boolean aBoolean) { - _log(String.format("onNext with return value \"%b\"", aBoolean)); + public void onNext(Boolean bool) { + _log(String.format("onNext with return value \"%b\"", bool)); } }; } From ff1ac9ade582434219c77eab34736769f15e7fa7 Mon Sep 17 00:00:00 2001 From: Kaushik Gopal Date: Tue, 2 Jun 2015 11:20:45 -0700 Subject: [PATCH 002/190] bef --- .../android/rxjava/ConcurrencyWithSchedulersDemoFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/morihacky/android/rxjava/ConcurrencyWithSchedulersDemoFragment.java b/app/src/main/java/com/morihacky/android/rxjava/ConcurrencyWithSchedulersDemoFragment.java index 290ea2d7..dac9749d 100644 --- a/app/src/main/java/com/morihacky/android/rxjava/ConcurrencyWithSchedulersDemoFragment.java +++ b/app/src/main/java/com/morihacky/android/rxjava/ConcurrencyWithSchedulersDemoFragment.java @@ -74,6 +74,7 @@ private Observable _getObservable() { return Observable.just(true).map(new Func1() { @Override public Boolean call(Boolean aBoolean) { + _log("Within Observable"); _doSomeLongOperation_thatBlocksCurrentThread(); return aBoolean; } From 43c0ac3bab83fc68bcc4dad66b3954a47de7e70f Mon Sep 17 00:00:00 2001 From: Kaushik Gopal Date: Tue, 2 Jun 2015 13:43:48 -0700 Subject: [PATCH 003/190] feat: add sample showing AsyncTask Vs RxJava equivalent --- .../android/rxjava/MainFragment.java | 1 + .../RetrofitAsyncTaskDeathFragment.java | 150 ++++++++++++++++++ .../android/rxjava/retrofit/GithubApi.java | 9 ++ .../fragment_retrofit_async_task_death.xml | 50 ++++++ 4 files changed, 210 insertions(+) create mode 100644 app/src/main/java/com/morihacky/android/rxjava/RetrofitAsyncTaskDeathFragment.java create mode 100644 app/src/main/res/layout/fragment_retrofit_async_task_death.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 2ebf26ff..4848a2cd 100644 --- a/app/src/main/java/com/morihacky/android/rxjava/MainFragment.java +++ b/app/src/main/java/com/morihacky/android/rxjava/MainFragment.java @@ -57,6 +57,7 @@ public void demoRetrofitCalls() { getActivity().getSupportFragmentManager() .beginTransaction() .addToBackStack(this.toString()) + //.replace(R.id.activity_main, new RetrofitAsyncTaskDeathFragment(), this.toString()) .replace(R.id.activity_main, new RetrofitFragment(), this.toString()) .commit(); } diff --git a/app/src/main/java/com/morihacky/android/rxjava/RetrofitAsyncTaskDeathFragment.java b/app/src/main/java/com/morihacky/android/rxjava/RetrofitAsyncTaskDeathFragment.java new file mode 100644 index 00000000..fee6e8c8 --- /dev/null +++ b/app/src/main/java/com/morihacky/android/rxjava/RetrofitAsyncTaskDeathFragment.java @@ -0,0 +1,150 @@ +package com.morihacky.android.rxjava; + +import android.os.AsyncTask; +import android.os.Bundle; +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.EditText; +import android.widget.ListView; +import butterknife.ButterKnife; +import butterknife.InjectView; +import butterknife.OnClick; +import com.morihacky.android.rxjava.retrofit.GithubApi; +import com.morihacky.android.rxjava.retrofit.User; +import java.util.ArrayList; +import retrofit.RequestInterceptor; +import retrofit.RestAdapter; +import rx.Observable; +import rx.Observer; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; +import rx.schedulers.Schedulers; +import timber.log.Timber; + +import static com.google.common.base.Strings.isNullOrEmpty; +import static java.lang.String.format; + +public class RetrofitAsyncTaskDeathFragment + extends Fragment { + + @InjectView(R.id.btn_demo_retrofit_async_death_username) EditText _username; + @InjectView(R.id.log_list) ListView _resultList; + + private GithubApi _api; + private ArrayAdapter _adapter; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + _api = _createGithubApi(); + } + + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + + View layout = inflater.inflate(R.layout.fragment_retrofit_async_task_death, + container, + false); + ButterKnife.inject(this, layout); + + _adapter = new ArrayAdapter<>(getActivity(), + R.layout.item_log, + R.id.item_log, + new ArrayList()); + //_adapter.setNotifyOnChange(true); + _resultList.setAdapter(_adapter); + + return layout; + } + + @OnClick(R.id.btn_demo_retrofit_async_death) + public void onGetGithubUserClicked() { + _adapter.clear(); + + /*new AsyncTask() { + + @Override + protected User doInBackground(String... params) { + return _api.getUser(params[0]); + } + + @Override + protected void onPostExecute(User user) { + _adapter.add(format("%s = [%s: %s]", _username.getText(), user.name, user.email)); + } + }.execute(_username.getText().toString());*/ + + + Observable.just(_username.getText().toString()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap(new Func1>() { + @Override + public Observable call(String username) { + return _api.user(username); + } + }) + .subscribe(new Observer() { + @Override + public void onCompleted() { + } + + @Override + public void onError(Throwable e) { + } + + @Override + public void onNext(User user) { + _adapter.add(format("%s = [%s: %s]", + _username.getText(), + user.name, + user.email)); + } + }); + + } + + // ----------------------------------------------------------------------------------- + + private GithubApi _createGithubApi() { + + RestAdapter.Builder builder = new RestAdapter.Builder().setEndpoint( + "https://api.github.com/"); + //.setLogLevel(RestAdapter.LogLevel.FULL); + + final String githubToken = getResources().getString(R.string.github_oauth_token); + if (!isNullOrEmpty(githubToken)) { + builder.setRequestInterceptor(new RequestInterceptor() { + @Override + public void intercept(RequestFacade request) { + request.addHeader("Authorization", format("token %s", githubToken)); + } + }); + } + + return builder.build().create(GithubApi.class); + } + + // ----------------------------------------------------------------------------------- + + private class GetGithubUser + extends AsyncTask { + + @Override + protected User doInBackground(String... params) { + return _api.getUser(params[0]); + } + + @Override + protected void onPostExecute(User user) { + _adapter.add(format("%s = [%s: %s]", _username.getText(), user.name, user.email)); + } + } +} diff --git a/app/src/main/java/com/morihacky/android/rxjava/retrofit/GithubApi.java b/app/src/main/java/com/morihacky/android/rxjava/retrofit/GithubApi.java index 9b606382..28ce3011 100644 --- a/app/src/main/java/com/morihacky/android/rxjava/retrofit/GithubApi.java +++ b/app/src/main/java/com/morihacky/android/rxjava/retrofit/GithubApi.java @@ -14,9 +14,18 @@ public interface GithubApi { Observable> contributors(@Path("owner") String owner, @Path("repo") String repo); + @GET("/repos/{owner}/{repo}/contributors") + List getContributors(@Path("owner") String owner, @Path("repo") String repo); + /** * See https://developer.github.com/v3/users/ */ @GET("/users/{user}") Observable user(@Path("user") String user); + + /** + * See https://developer.github.com/v3/users/ + */ + @GET("/users/{user}") + User getUser(@Path("user") String user); } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_retrofit_async_task_death.xml b/app/src/main/res/layout/fragment_retrofit_async_task_death.xml new file mode 100644 index 00000000..ad4d565b --- /dev/null +++ b/app/src/main/res/layout/fragment_retrofit_async_task_death.xml @@ -0,0 +1,50 @@ + + + + + + + + +