160714 roppongi aar3_how_to_implement_activity

14
In 2016, how do you implement "Web API client Activity"? Tsuyoshi Yoshioka (@tsuyogoro) Mercari, Inc.

Transcript of 160714 roppongi aar3_how_to_implement_activity

Page 1: 160714 roppongi aar3_how_to_implement_activity

In 2016, how do you implement"Web API client Activity"?

Tsuyoshi Yoshioka (@tsuyogoro)Mercari, Inc.

Page 2: 160714 roppongi aar3_how_to_implement_activity

About meTsuyoshi Yoshioka (@tsuyogoro)

Android engineer

Mercari, Inc

Page 3: 160714 roppongi aar3_how_to_implement_activity

How do you implement this app?

Using a web API - http://zipcloud.ibsnet.co.jp/doc/api

Page 4: 160714 roppongi aar3_how_to_implement_activity

Today’s focus on

How to support “orientation change” ?

Page 5: 160714 roppongi aar3_how_to_implement_activity

Base of my idea

Activity(Portrait)

Activity(Landscape)

DataModelAPI task

Web API(Search address)

share share

“Wait…” dialog

1. How to share “Data model” ?2. How to share “API task” ?3. How to show ProgressDialog in correct period ?

Page 6: 160714 roppongi aar3_how_to_implement_activity

We have 3 weapons

● Databinding

● RxJava

● Lifecycle of Activity & Fragment

Page 7: 160714 roppongi aar3_how_to_implement_activity

1.Sharing model with databinding

public class ZipSearchActivityModel implements Serializable {

private static final long serialVersionUID = 123L;

/** * ユーザの入力した郵便番号 * */ public ObservableField<String> zipCode = new ObservableField<>();

/** * 検索した結果の住所 * (場合によってはエラー文言を表示するのに使う ) * */ public ObservableField<String> address = new ObservableField<>();

}

<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@={model.zipCode}"/>

<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_marginBottom="16dp" android:text="@{model.address}"/>

☆ Two-way bindinghttps://halfthought.wordpress.com/2016/03/23/2-way-data-binding-on-android/

Page 8: 160714 roppongi aar3_how_to_implement_activity

1.Sharing model with databinding

Can implement model sharing, Quite simple & safely

public class ZipSearchActivityModel implements Serializable {

private static final long serialVersionUID = 123L;

/** * ユーザの入力した郵便番号 * */ public ObservableField<String> zipCode = new ObservableField<>();

/** * 検索した結果の住所 * (場合によってはエラー文言を表示するのに使う ) * */ public ObservableField<String> address = new ObservableField<>();

} Serializable

Serializable

Can use android studio plug-in

@Overrideprotected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable(BUNDLE_KEY_MODEL, model);}

Page 9: 160714 roppongi aar3_how_to_implement_activity

2. Task sharing with RxJava

ZipSearchTask.buildRequest(model.zipCode.get()) .flatMap(ZipSearchTask::submitRequest) .flatMap(ZipSearchTask::parseResponse) .delay(5, TimeUnit.SECONDS) .subscribeOn(Schedulers.newThread())

.observeOn(AndroidSchedulers.mainThread()) .subscribe(mySubscriber);

Task

Listener

Page 10: 160714 roppongi aar3_how_to_implement_activity

Base of my idea

Activity(Portrait)

Activity(Landscape)

DataModel

Observable

Web API(Search address)

share shareSubscriber

Page 11: 160714 roppongi aar3_how_to_implement_activity

2. Task sharing with RxJavapublic class RxZipSearchActivity extends AppCompatActivity {

private MySubscriber mySubscriber;

@Overrideprotected void onCreate(Bundle savedInstanceState) {

...mySubscriber = (MySubscriber) getLastCustomNonConfigurationInstance();

if (mySubscriber != null) { mySubscriber.activeActivity = this; }...

@Overridepublic Object onRetainCustomNonConfigurationInstance() { return mySubscriber;}

Can implement task sharing, Quite simple & safely

Page 12: 160714 roppongi aar3_how_to_implement_activity

3. Progress dialog

private void showProgressDialog() { if (getSupportFragmentManager().findFragmentByTag(TAG_PROGRESS_DIALOG) == null) { new ProgressDialogFragment().show(getSupportFragmentManager(), TAG_PROGRESS_DIALOG); }}

public static class ProgressDialogFragment extends AppCompatDialogFragment {

@Overrideprotected void onResume() { super.onResume(); // まだ通信の途中だったら dialogを出す if (mySubscriber != null && !mySubscriber.isUnsubscribed()) { showProgressDialog(); }

● Avoid multiple dialog showing

● Subscriber can be a clue if to show progress dialog

Page 13: 160714 roppongi aar3_how_to_implement_activity

Summary

Introduced my idea to implement simple WebAPI client app

We have efficient way in 2016 (databinding, RxJava)

Let’s discuss how you design / implement such application now?

(Source code intoduced in my presentation)https://github.com/tsuyoyo/roppongi-aar3-address-search-app

Page 14: 160714 roppongi aar3_how_to_implement_activity

2. RxJava Can implement task sharing, Quite simple & safely

public class RxZipSearchActivity extends AppCompatActivity {

private static class MySubscriber extends Subscriber<List<String>> {

private RxZipSearchActivity activeActivity;

@Override public void onCompleted() { Log.d("TestTestTest", "onCompleted"); }

@Override public void onError(Throwable e) { notifyResult(e.getMessage()); }

@Override public void onNext(List<String> result) {

activeActivity.notifyResult(result);onCompleted();