Slide 1

Slide 1 text

ⴱ䗰罏ך׋׭ך 3Y+BWB 랲䊛峔 吳䒭⠓爡'BCMJD !IZESBLFDBU

Slide 2

Slide 2 text

3Y+BWB ˖ 3Y 3FBDUJWF&YUFOTJPO ך+BWB㹋鄲

Slide 3

Slide 3 text

3Y+BWB ˖ 3Y 3FBDUJWF&YUFOTJPO ך+BWB㹋鄲 3FBDUJWF

Slide 4

Slide 4 text

3FBDUJWF1SPHSBNNJOHהכ ˑBQSPHSBNNJOHQBSBEJHNPSJFOUFEBSPVOEEBUBGMPXTBOEUIF QSPQBHBUJPOPGDIBOHF˒ 3FBDUJWFQSPHSBNNJOH8JLJQFEJB IUUQTFOXJLJQFEJBPSHX JOEFYQIQ UJUMF3FBDUJWF@QSPHSBNNJOHPMEJE ˑ3FBDUJWFQSPHSBNTBMTPNBJOUBJOBDPOUJOVPVTJOUFSBDUJPOXJUI UIFJSFOWJSPONFOU CVUBUBTQFFEXIJDIJTEFUFSNJOFECZUIF FOWJSPONFOU OPUUIFQSPHSBNJUTFMG˒ 3FBDUJWFQSPHSBNNJOH8JLJQFEJB IUUQTFOXJLJQFEJBPSHXJLJ3FBDUJWF@QSPHSBNNJOH

Slide 5

Slide 5 text

3FBDUJWF1SPHSBNNJOHהכ ˑ3FBDUJWFQSPHSBNTBMTPNBJOUBJOBDPOUJOVPVTJOUFSBDUJPOXJUI UIFJSFOWJSPONFOU CVUBUBTQFFEXIJDIJTEFUFSNJOFECZUIF FOWJSPONFOU OPUUIFQSPHSBNJUTFMG˒ 3FBDUJWFQSPHSBNNJOH8JLJQFEJB IUUQTFOXJLJQFEJBPSHXJLJ3FBDUJWF@QSPHSBNNJOH ˑBQSPHSBNNJOHQBSBEJHNPSJFOUFEBSPVOEEBUBGMPXTBOEUIF QSPQBHBUJPOPGDIBOHF˒ 3FBDUJWFQSPHSBNNJOH8JLJQFEJB IUUQTFOXJLJQFEJBPSHX JOEFYQIQ UJUMF3FBDUJWF@QSPHSBNNJOHPMEJE

Slide 6

Slide 6 text

3FBDUJWF1SPHSBNNJOHהכ ˑBQSPHSBNNJOHQBSBEJHNPSJFOUFEBSPVOEEBUBGMPXTBOEUIF QSPQBHBUJPOPGDIBOHF˒ 3FBDUJWFQSPHSBNNJOH8JLJQFEJB IUUQTFOXJLJQFEJBPSHXJLJ3FBDUJWF@QSPHSBNNJOH 5SBOTGPSNBUJPOBM 㢌䳔㘗 㢌侧ח㼎ׅ׷乼⡲׾אא鎸鶢

Slide 7

Slide 7 text

3FBDUJWF1SPHSBNNJOHהכ ˑBQSPHSBNNJOHQBSBEJHNPSJFOUFEBSPVOEEBUBGMPXTBOEUIF QSPQBHBUJPOPGDIBOHF˒ 3FBDUJWFQSPHSBNNJOH8JLJQFEJB IUUQTFOXJLJQFEJBPSHXJLJ3FBDUJWF@QSPHSBNNJOH 5SBOTGPSNBUJPOBM 㢌䳔㘗 㢌侧ח㼎ׅ׷乼⡲׾אא鎸鶢 3FBDUJWF ر٦ةؿٗ٦׾㹑鎉׃גַ׵ծ㢌刿׾⠗乄ׇׁ׷

Slide 8

Slide 8 text

5SBOTGPSNBUJPOBM 3FBDUJWF1SPHSBNNJOHהכ A = 2 B = 3 C = (A + 1) x (B - 1)

Slide 9

Slide 9 text

3FBDUJWF1SPHSBNNJOHהכ A = 2 B = 3 C = (A + 1) x (B - 1) 3FBDUJWF Y " # $ 5SBOTGPSNBUJPOBM

Slide 10

Slide 10 text

3FBDUJWF1SPHSBNNJOHהכ A = 2 B = 3 C = (A + 1) x (B - 1) Y " # $ 5SBOTGPSNBUJPOBM 3FBDUJWF

Slide 11

Slide 11 text

3FBDUJWF1SPHSBNNJOHהכ A = 2 B = 3 C = (A + 1) x (B - 1) Y " # $ 5SBOTGPSNBUJPOBM 3FBDUJWF

Slide 12

Slide 12 text

3FBDUJWF1SPHSBNNJOHהכ A = 2 B = 3 C = (A + 1) x (B - 1) A = 3 Y " # $ 5SBOTGPSNBUJPOBM 3FBDUJWF

Slide 13

Slide 13 text

3FBDUJWF1SPHSBNNJOHהכ A = 2 B = 3 C = (A + 1) x (B - 1) A = 3 Y " # $ 5SBOTGPSNBUJPOBM 3FBDUJWF

Slide 14

Slide 14 text

3FBDUJWF1SPHSBNNJOHהכ A = 2 B = 3 C = (A + 1) x (B - 1) A = 3 Y " # $ 5SBOTGPSNBUJPOBM 3FBDUJWF

Slide 15

Slide 15 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ network.getDataA();

Slide 16

Slide 16 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ network.getDataA(new NetworkCall.Listener() {
 @Override public void success(String data) {
 }
 });

Slide 17

Slide 17 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ network.getDataA(new NetworkCall.Listener() {
 @Override public void success(String data) {
 network.getDataB(data);
 }
 });

Slide 18

Slide 18 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ network.getDataA(new NetworkCall.Listener() {
 @Override public void success(String data) {
 network.getDataB(data, new NetworkCall.Listener() {
 @Override public void success(String data) {
 }‌
 });
 }
 });

Slide 19

Slide 19 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ network.getDataA(new NetworkCall.Listener() {
 @Override public void success(String data) {
 network.getDataB(data, new NetworkCall.Listener() {
 @Override public void success(String data) {
 tv.setText(data);
 }‌
 });
 }
 });

Slide 20

Slide 20 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ network.getDataA(new NetworkCall.Listener() {
 @Override public void success(String data) {
 network.getDataB(data, new NetworkCall.Listener() {
 @Override public void success(String data) {
 tv.setText(data);
 }‌
 
 @Override public void failure(Throwable t) {}
 });
 }
 
 @Override public void failure(Throwable t) {}
 });

Slide 21

Slide 21 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ network.getDataA(new NetworkCall.Listener() {
 @Override public void success(String data) {
 network.getDataB(data, new NetworkCall.Listener() {
 @Override public void success(String data) {
 if (!isDestroyed()) {
 tv.setText(data);
 }
 }‌
 
 @Override public void failure(Throwable t) {}
 });
 }
 
 @Override public void failure(Throwable t) {}
 });

Slide 22

Slide 22 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ network.getDataA(new NetworkCall.Listener() {
 @Override public void success(String data) {
 network.getDataB(data, new NetworkCall.Listener() {
 @Override public void success(String data) {
 runOnUiThread(() -> {
 if (!isDestroyed()) {
 tv.setText(data);
 }
 });
 }‌
 
 @Override public void failure(Throwable t) {}
 });
 }
 
 @Override public void failure(Throwable t) {}
 });

Slide 23

Slide 23 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ

Slide 24

Slide 24 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ

Slide 25

Slide 25 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ

Slide 26

Slide 26 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ

Slide 27

Slide 27 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ

Slide 28

Slide 28 text

ז׈"OESPJE،فٔꟚ涪ד31ָ岣湡ׁ׸׷ךַ

Slide 29

Slide 29 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 30

Slide 30 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 31

Slide 31 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 32

Slide 32 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 33

Slide 33 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM subscribe

Slide 34

Slide 34 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 35

Slide 35 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 36

Slide 36 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 37

Slide 37 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM completed

Slide 38

Slide 38 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 39

Slide 39 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM Observable subscribe(Subscriber)

Slide 40

Slide 40 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM Observable subscribe(Subscriber) Subscriber onNext() onCompleted() onError()

Slide 41

Slide 41 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 42

Slide 42 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 43

Slide 43 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM

Slide 44

Slide 44 text

3FBDUJWF&YUFOTJPO 3Y הכ BMJCSBSZGPSDPNQPTJOHBTZODISPOPVTBOEFWFOUCBTFE QSPHSBNTVTJOHPCTFSWBCMFTFRVFODFT˒ 3FBDUJWF9*OUSP IUUQSFBDUJWFYJPJOUSPIUNM Operator

Slide 45

Slide 45 text

3FBDUJWF&YUFOTJPO 3Y הכ 1 2 3 4 5 6 < > GPSxJO JGx % 2 == 0UIFO QVTIx * x UP list FOE FOE SFUVSOlist

Slide 46

Slide 46 text

3FBDUJWF&YUFOTJPO 3Y הכ 1 2 3 4 5 6 < > GJMUFS x % 2 == 0 NBQ x -> x * x

Slide 47

Slide 47 text

3FBDUJWF&YUFOTJPO 3Y הכ 1 2 3 4 5 6

Slide 48

Slide 48 text

3FBDUJWF&YUFOTJPO 3Y הכ 1 2 3 4 5 6 GJMUFS x % 2 == 0 NBQ x -> x * x

Slide 49

Slide 49 text

3FBDUJWF&YUFOTJPO 3Y הכ 1 2 3 4 5 6 GJMUFS x % 2 == 0 NBQ x -> x * x 4 16 36

Slide 50

Slide 50 text

3FBDUJWF&YUFOTJPO 3Y הכ 4 16 36 Observable.just(1, 2, 3, 4, 5, 6)
 .filter(x -> x % 2 == 0)
 .map(x -> x * x)
 .subscribe(System.out ::println);

Slide 51

Slide 51 text

˖ ꬊず劍Ⳣ椚 ˖ 6*؎كٝزⳢ椚 ˖ ꬊず劍Ⳣ椚6*؎كٝزⳢ椚 3Y+BWBד⡦ָדֹ׷ךַ

Slide 52

Slide 52 text

˖ ꬊず劍Ⳣ椚 ˖ 6*؎كٝزⳢ椚 ˖ ꬊず劍Ⳣ椚6*؎كٝزⳢ椚 3Y+BWBד⡦ָדֹ׷ךַ

Slide 53

Slide 53 text

3Y+BWBד⡦ָדֹ׷ךַ network.getDataA(new NetworkCall.Listener() {
 @Override public void success(String data) {
 network.getDataB(data, new NetworkCall.Listener() {
 @Override public void success(String data) {
 runOnUiThread(() -> {
 if (!isDestroyed()) {
 tv.setText(data);
 }
 });
 }
 
 @Override public void failure(Throwable t) {}
 });
 }
 
 @Override public void failure(Throwable t) {}
 });

Slide 54

Slide 54 text

network.getDataA(); 3Y+BWBד⡦ָדֹ׷ךַ

Slide 55

Slide 55 text

network.getDataA()
 .subscribe(
 data -> tv.setText(data),
 throwable -> Log.e(TAG, throwable.getMessage())
 ); 3Y+BWBד⡦ָדֹ׷ךַ

Slide 56

Slide 56 text

network.getDataA()
 .flatMap(data -> network.getDataB(data))
 .subscribe(
 data -> tv.setText(data),
 throwable -> Log.e(TAG, throwable.getMessage())
 ); 3Y+BWBד⡦ָדֹ׷ךַ

Slide 57

Slide 57 text

network.getDataA() .subscribeOn(Schedulers.io())
 .flatMap(data -> network.getDataB(data))
 .subscribe(
 data -> tv.setText(data),
 throwable -> Log.e(TAG, throwable.getMessage())
 ); 3Y+BWBד⡦ָדֹ׷ךַ

Slide 58

Slide 58 text

network.getDataA() .subscribeOn(Schedulers.io())
 .flatMap(data -> network.getDataB(data)) .observeOn(AndroidSchedulers.mainThread())
 .subscribe(
 data -> tv.setText(data),
 throwable -> Log.e(TAG, throwable.getMessage())
 ); 3Y+BWBד⡦ָדֹ׷ךַ

Slide 59

Slide 59 text

subscription = network.getDataA()
 .subscribeOn(Schedulers.io())
 .flatMap(data -> network.getDataB(data)) .observeOn(AndroidSchedulers.mainThread())
 .subscribe(
 data -> tv.setText(data),
 throwable -> Log.e(TAG, throwable.getMessage())
 ); 3Y+BWBד⡦ָדֹ׷ךַ

Slide 60

Slide 60 text

@Override public void onCreate(Bundle savedInstanceState) { …
 subscription = network.getDataA()
 .subscribeOn(Schedulers.io())
 .flatMap(data -> network.getDataB(data))
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(
 data -> tv.setText(data),
 throwable -> Log.e(TAG, throwable.getMessage())
 );
 } 3Y+BWBד⡦ָדֹ׷ךַ

Slide 61

Slide 61 text

@Override public void onCreate(Bundle savedInstanceState) { …
 subscription = network.getDataA()
 .subscribeOn(Schedulers.io())
 .flatMap(data -> network.getDataB(data))
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(
 data -> tv.setText(data),
 throwable -> Log.e(TAG, throwable.getMessage())
 );
 }
 @Override public void onDestroy() {
 super.onDestroy();
 subscription.unsubscribe();
 } 3Y+BWBד⡦ָדֹ׷ךַ

Slide 62

Slide 62 text

@Override public void onCreate(Bundle savedInstanceState) { …
 subscription = network.getDataA()
 .subscribeOn(Schedulers.io())
 .flatMap(data -> network.getDataB(data))
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(
 data -> tv.setText(data),
 throwable -> Log.e(TAG, throwable.getMessage())
 );
 }
 @Override public void onDestroy() {
 super.onDestroy();
 subscription.unsubscribe();
 } 3Y+BWBד⡦ָדֹ׷ךַ

Slide 63

Slide 63 text

3Y+BWBד⡦ָדֹ׷ךַ

Slide 64

Slide 64 text

˖ ꬊず劍Ⳣ椚 ˖ 6*؎كٝزⳢ椚 ˖ ꬊず劍Ⳣ椚6*؎كٝزⳢ椚 3Y+BWBד⡦ָדֹ׷ךַ

Slide 65

Slide 65 text

6*؎كٝزⳢ椚 ׅץגWBMJE׌׏׋㜥さך׫ TVCNJUنةٝ׾FOBCMFחׅ׷ 3Y+BWBד⡦ָדֹ׷ךַ

Slide 66

Slide 66 text

8JUIPVU3Y+BWB private void setup() {
 input1.addTextChangedListener(new TextWatcher() {
 @Override public void onTextChanged(CharSequence s, int start, int before, int count) {
 input1Valid = s.length() > 0;
 validate();
 }
 });
 … }
 
 private void validate() {
 button.setEnabled(input1Valid && input2Valid && input3Valid);
 } 3Y+BWBד⡦ָדֹ׷ךַ

Slide 67

Slide 67 text

8JUI3Y+BWB private void setup() {
 ArrayList> validators = new ArrayList <>();
 validators.add(RxTextView.textChanges(input1).map(s -> s.length() > 0));
 … 
 Observable.combineLatest(validators, args -> {
 for (Object a : args) {
 if (!(Boolean) a) return false;
 }
 return true;
 }).subscribe(button ::setEnabled);
 } 3Y+BWBד⡦ָדֹ׷ךַ

Slide 68

Slide 68 text

8JUI3Y+BWB private void setup() {
 ArrayList> validators = new ArrayList <>();
 validators.add(RxTextView.textChanges(input1).map(s -> s.length() > 0));
 … 
 Observable.combineLatest(validators, args -> {
 for (Object a : args) {
 if (!(Boolean) a) return false;
 }
 return true;
 }).subscribe(button ::setEnabled);
 } 3Y+BWBד⡦ָדֹ׷ךַ

Slide 69

Slide 69 text

8JUI3Y+BWB private void setup() {
 ArrayList> validators = new ArrayList <>();
 validators.add(RxTextView.textChanges(input1).map(s -> s.length() > 0));
 … 
 Observable.combineLatest(validators, args -> {
 for (Object a : args) {
 if (!(Boolean) a) return false;
 }
 return true;
 }).subscribe(button ::setEnabled);
 } 3Y+BWBד⡦ָדֹ׷ךַ

Slide 70

Slide 70 text

8JUI3Y+BWB private void setup() {
 ArrayList> validators = new ArrayList <>();
 validators.add(RxTextView.textChanges(input1).map(s -> s.length() > 0));
 … 
 Observable.combineLatest(validators, args -> {
 for (Object a : args) {
 if (!(Boolean) a) return false;
 }
 return true;
 }).subscribe(button ::setEnabled);
 } 3Y+BWBד⡦ָדֹ׷ךַ

Slide 71

Slide 71 text

3Y+BWBד⡦ָדֹ׷ךַ

Slide 72

Slide 72 text

˖ ꬊず劍Ⳣ椚 ˖ 6*؎كٝزⳢ椚 ˖ ꬊず劍Ⳣ椚6*؎كٝزⳢ椚 3Y+BWBד⡦ָדֹ׷ךַ

Slide 73

Slide 73 text

3Y+BWBד⡦ָדֹ׷ךַ ꬊず劍Ⳣ椚6*؎كٝزⳢ椚 ꬊず劍Ⳣ椚6*؎كٝزⳢ椚

Slide 74

Slide 74 text

3Y+BWBד⡦ָדֹ׷ךַ ꬊず劍Ⳣ椚6*؎كٝزⳢ椚 أؙٗ٦ָٕ⨡姺׃׋׵ꬊず 劍Ⳣ椚׾㨣׭ծأؙٗ٦ָٕ Ꟛ㨣׃׋׵װ׭׷ ؕؐٝزָחז׏׋׵ 穠卓ָ邌爙ׁ׸׷

Slide 75

Slide 75 text

3Y+BWBד⡦ָדֹ׷ךַ ConnectableObservable idling =
 RxAbsListView.scrollEvents(listView)
 .map(event -> event.scrollState()
 == AbsListView.OnScrollListener.SCROLL_STATE_IDLE)
 .distinctUntilChanged()
 .publish(); أؙٗ٦ٕךꟚ㨣⨡姺׾嗚濼ׅ׷0CTFSWBCMF

Slide 76

Slide 76 text

3Y+BWBד⡦ָדֹ׷ךַ ConnectableObservable idling =
 RxAbsListView.scrollEvents(listView)
 .map(event -> event.scrollState()
 == AbsListView.OnScrollListener.SCROLL_STATE_IDLE)
 .distinctUntilChanged()
 .publish(); أؙٗ٦ٕךꟚ㨣⨡姺׾嗚濼ׅ׷0CTFSWBCMF

Slide 77

Slide 77 text

3Y+BWBד⡦ָדֹ׷ךַ

Slide 78

Slide 78 text

3Y+BWBד⡦ָדֹ׷ךַ أؙٗ٦ָٕ⨡姺׃׋׵ꬊず劍Ⳣ椚׾Ꟛ㨣ׅ׷ final Subscription s = idling.startWith(true)
 .subscribe(l -> showLog("Success!"));

Slide 79

Slide 79 text

3Y+BWBד⡦ָדֹ׷ךַ أؙٗ٦ָٕ⨡姺׃׋׵ꬊず劍Ⳣ椚׾Ꟛ㨣ׅ׷ final Subscription s = idling.startWith(true)
 .filter(b -> b)
 .subscribe(l -> showLog("Success!"));

Slide 80

Slide 80 text

3Y+BWBד⡦ָדֹ׷ךַ أؙٗ٦ָٕ⨡姺׃׋׵ꬊず劍Ⳣ椚׾Ꟛ㨣ׅ׷ final Subscription s = idling.startWith(true)
 .filter(b -> b)
 .flatMap(aBool -> serivce.getData())
 .subscribe(l -> showLog("Success!"));

Slide 81

Slide 81 text

3Y+BWBד⡦ָדֹ׷ךַ أؙٗ٦ָٕꟚ㨣׃׋׵ꬊず劍Ⳣ椚׾⨡姺ׅ׷ final Subscription s = idling.startWith(true)
 .filter(b -> b)
 .flatMap(aBool -> serivce.getData())
 .subscribe(l -> showLog("Success!"));

Slide 82

Slide 82 text

3Y+BWBד⡦ָדֹ׷ךַ أؙٗ٦ָٕꟚ㨣׃׋׵ꬊず劍Ⳣ椚׾⨡姺ׅ׷ final Subscription s = idling.startWith(true)
 .filter(b -> b)
 .flatMap(aBool -> serivce.getData()) .takeUntil(idling.filter(b -> !b))
 .repeatWhen(completes -> completes.switchMap(
 c -> idling.filter(b -> b)))
 .subscribe(l -> showLog("Success!"));

Slide 83

Slide 83 text

3Y+BWBד⡦ָדֹ׷ךַ أؙٗ٦ָٕꟚ㨣׃׋׵ꬊず劍Ⳣ椚׾⨡姺ׅ׷ final Subscription s = idling.startWith(true)
 .filter(b -> b)
 .flatMap(aBool -> serivce.getData()) .takeUntil(idling.filter(b -> !b))
 .repeatWhen(completes -> completes.switchMap(
 c -> idling.filter(b -> b)))
 .subscribe(l -> showLog("Success!"));

Slide 84

Slide 84 text

3Y+BWBד⡦ָדֹ׷ךַ

Slide 85

Slide 85 text

3Y+BWBד⡦ָדֹ׷ךַ أؙٗ٦ָٕ⨡姺׃׋׵ⱄTVCTDSJCFׅ׷ final Subscription s = idling.startWith(true)
 .filter(b -> b)
 .flatMap(aBool -> serivce.getData()) .takeUntil(idling.filter(b -> !b))
 .repeatWhen(completes -> completes.switchMap(
 c -> idling.filter(b -> b)))
 .subscribe(l -> showLog("Success!"));

Slide 86

Slide 86 text

3Y+BWBד⡦ָדֹ׷ךַ

Slide 87

Slide 87 text

final Subscription s = idling.startWith(true)
 .filter(b -> b)
 .flatMap(aBool -> serivce.getData()) .takeUntil(idling.filter(b -> !b))
 .repeatWhen(completes -> completes.switchMap(
 c -> idling.filter(b -> b)))
 .subscribe(l -> showLog("Success!")); 3Y+BWBד⡦ָדֹ׷ךַ 㹋遤ׅ׷أٖحس׾䭷㹀ׅ׷

Slide 88

Slide 88 text

3Y+BWBד⡦ָדֹ׷ךַ 㹋遤ׅ׷أٖحس׾䭷㹀ׅ׷ final Subscription s = idling.startWith(true)
 .subscribeOn(Schedulers.io())
 .filter(b -> b)
 .flatMap(aBool -> serivce.getData())
 .takeUntil(idling.filter(b -> !b))
 .repeatWhen(completes -> completes.switchMap(
 c -> idling.filter(b -> b)))
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(l -> showLog("Success!"));

Slide 89

Slide 89 text

3Y+BWBד⡦ָדֹ׷ךַ ConnectableObservable idling =
 RxAbsListView.scrollEvents(listView)
 .map(event -> event.scrollState()
 == AbsListView.OnScrollListener.SCROLL_STATE_IDLE)
 .distinctUntilChanged()
 .publish();
 subscriptions.add(idling.connect());
 
 subscriptions.add(idling.startWith(true)
 .subscribeOn(Schedulers.io())
 .filter(b -> b)
 .flatMap(aBool -> serivce.getData())
 .takeUntil(idling.filter(b -> !b))
 .repeatWhen(completes -> completes.switchMap( c -> idling.filter(b -> b)))
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(l -> showLog("Success!")));

Slide 90

Slide 90 text

ًٔحز ˖ ؎كٝزװꬊず劍Ⳣ椚ָ䪔ְװְׅ ˖ 朐䡾㢌侧ָ㼰זֻג幥׬ ˖ ر٦ةؿٗ٦ך鋅鸐׃ָ葺ֻז׷ 3Y+BWBךًٔحزرًٔحز

Slide 91

Slide 91 text

ًٔحز ˖ ؎كٝزװꬊず劍Ⳣ椚ָ䪔ְװְׅ ˖ 朐䡾㢌侧ָ㼰זֻג幥׬ ˖ ر٦ةؿٗ٦ך鋅鸐׃ָ葺ֻז׷ رًٔحز ˖ 湫䠬涸הכꣲ׵זְ ˖ ⢪ְֿזׅחכ䢪׸ָ䗳銲 ˖ ➬穈׫׾椚鍑׃גְזְה縐ח䅹׶װְׅ 3Y+BWBךًٔحزرًٔحز

Slide 92

Slide 92 text

ז׈㷕统؝أزָ넝ְךַ

Slide 93

Slide 93 text

˖ ؔلٖ٦ةָ׋ֻׁ׿֮׷ ז׈㷕统؝أزָ넝ְךַ

Slide 94

Slide 94 text

˖ ؔلٖ٦ةָ׋ֻׁ׿֮׷ ז׈㷕统؝أزָ넝ְךַ all() amb() ambWith() and() asyncAction() asyncFunc() averageDouble() averageFloat() averageInteger() averageLong() buffer() cache() cast() chunkify() collect() combineLatest() concat() concatMap() concatWith() connect() contains() count() countLong() create() debounce() defaultIfEmpty() defer() deferFuture() deferCancellableFuture() delay() dematerialize() distinct() distinctUntilChanged() doOnCompleted() doOnEach() doOnError() doOnNext() doOnRequest() doOnSubscribe() doOnTerminate() doOnUnsubscribe() doWhile() elementAt() elementAtOrDefault() empty() error() exists() filter() finallyDo() first() firstOrDefault() flatMap() flatMapIterable() forEach() forIterable() from() fromAction() fromCallable() fromCancellableFuture() fromFunc0() fromFuture() fromRunnable() generate() generateAbsoluteTime() getIterator() groupBy() groupByUntil() groupJoin() ifThen() ignoreElements() interval() isEmpty() join() just() last() lastOrDefault()

Slide 95

Slide 95 text

˖ ؔلٖ٦ةָ׋ֻׁ׿֮׷ ˖ װװֿ׃ְ嚊䙀 ז׈㷕统؝أزָ넝ְךַ

Slide 96

Slide 96 text

˖ ؔلٖ٦ةָ׋ֻׁ׿֮׷ ˖ װװֿ׃ְ嚊䙀 ˖ )PU$PME0CTFSWBCMF ˖ 4DIFEVMFS ˖ 4VCTDSJQUJPO ˖ 4VCKFDU ˖ #BDLQSFTTVSF ז׈㷕统؝أزָ넝ְךַ

Slide 97

Slide 97 text

سًُؗٝز׾铣׬ ؔلٖ٦ةך⹛ֹ׾䗰ד椚鍑ׅ׷ ؔلٖ٦ةךؕذ؞ٔ׾濼׷ ٓ؎ـٓٔ׾ⵃ欽ׅ׷ 嚂׃׬ 3Y+BWBך㷕统岀

Slide 98

Slide 98 text

3FBDUJWF93Y+BWB8JLJ IUUQTHJUIVCDPN3FBDUJWF9 3Y+BWBXJLJ *OUSPEVDUJPOUP3Y IUUQXXXJOUSPUPSYDPN 3Y4BNQMFT IUUQSYXJLJXJLJEPUDPN TBNQMFT سًُؗٝز׾铣׬

Slide 99

Slide 99 text

3Y+4ד鑐ׅ ˖ &4 #BCFM ˖ IUUQTKTGJEEMFOFUIZESBLFDBUGUWQIO ؔلٖ٦ةך⹛ֹ׾䗰ד椚鍑ׅ׷

Slide 100

Slide 100 text

˖ $SFBUJOH ˖ 5SBOTGPSNJOH ˖ 'JMUFSJOH ˖ $PNCJOJOH ˖ &SSPS)BOEMJOH ˖ $POEJUJPOBMBOE#PPMFBO ˖ .BUIFNBUJDBMBOE"HHSFHBUF ؔلٖ٦ةךؕذ؞ٔ׾濼׷

Slide 101

Slide 101 text

א⟃♳ך0CTFSWBCMF׾⢪ְ׋ְ 
 ̔$PNCJOJOH$POEJUJPOBM אך0CTFSWBCMFח׃ַ莆㄂ָזְ 
 ̔5SBOTGPSNJOH'JMUFSJOH 0CTFSWBCMF׾⡲׶׋ְ 
 ̔$SFBUJOH ؔلٖ٦ةךؕذ؞ٔ׾濼׷ "%FDJTJPO5SFFPG0CTFSWBCMF0QFSBUPST IUUQSFBDUJWFYJPEPDVNFOUBUJPOPQFSBUPSTIUNM

Slide 102

Slide 102 text

˖ 0CTFSWBCMFDSFBUF ד0CTFSWBCMF׾⡲׵זְֿה☠ ˖ ׋ְגְך׮ךכٓ؎ـٓٔח֮׷ ˖ طحزٙ٦ؙ鸐⥋̔3FUSPGJU ˖ 42-̔42-#SJUF 0SNB ˖ 6*؎كٝز̔3Y#JOEJOH ˖ וֲ׃ג׮זְ㜥さכ0CTFSWBCMFGSPN9 ׾⢪ֲ ˖ GSPN$BMMBCMF ˖ GSPN&NJUUFS ٓ؎ـٓٔ׾ⵃ欽ׅ׷

Slide 103

Slide 103 text

嚂׃׬ IUUQTMJEFTDPNSPCXPSNBMEFWFSZUIJOHJTBTUSFBN ˖ 걧ך⢪ְ倯ָ殯ז׷ ˖ ֲתֻ剅ֽ׷הֲ׸׃ְ ˖ 㔭׏׋׵BOESPJEKQ4MBDLפ
 IUUQTBOESPJEKQIFSPLVBQQDPN

Slide 104

Slide 104 text

˖ 3Y+BWB3$ ˖ 3FBDUJWF4USFBNTك٦أ ˖ 'JOBM3FMFBTFTDIFEVMFEBUUI0DU 3Y+BWBךֿ׸ַ׵

Slide 105

Slide 105 text

˖ 3Y+BWB3$ ˖ 3FBDUJWF4USFBNTك٦أ ˖ 'JOBM3FMFBTFTDIFEVMFEBUUI0DU 3Y+BWBךֿ׸ַ׵ 3FBDUJWF4USFBNT

Slide 106

Slide 106 text

˖ +BWBדך垥彊⻉ KVD'MPX ˖ IUUQTDPNNVOJUZPSBDMFDPNEPDT%0$ ˖ 彊䬿׃גְ׷ٓ؎ـٓٔ ˖ "LLB4USFBNT ˖ 3FBDUPS ˖ 3Y+BWB 3FBDUJWF4USFBNT

Slide 107

Slide 107 text

˖ +BWBדך垥彊⻉ KVD'MPX ˖ IUUQTDPNNVOJUZPSBDMFDPNEPDT%0$ ˖ 彊䬿׃גְ׷ٓ؎ـٓٔ ˖ "LLB4USFBNT ˖ 3FBDUPS ˖ 3Y+BWB 3FBDUJWF4USFBNT ״׶أةٝت٦سח

Slide 108

Slide 108 text

˖ 3FBDUJWFQSPHSBNNJOH8JLJQFEJB UIFGSFFFODZDMPQFEJB
 IUUQTFOXJLJQFEJBPSHXJLJ3FBDUJWF@QSPHSBNNJOH ˖ ++6(ش؎زإىش٦ד3FBDUJWF4USFBNTחאְג涪邌׃ת׃׋
 IUUQPLBQJFTIBUFCMPKQFOUSZ ˖ 3FBDUJWF9
 IUUQSFBDUJWFYJP ˖ &YQMPSJOH3Y+BWBGPS"OESPJE (050DQI0DUPCFS 
 IUUQTTQFBLFSEFDLDPNKBLFXIBSUPOFYQMPSJOHSYKBWBGPS BOESPJEHPUPDQIPDUPCFS ˖ 3FBDUJWF1SPHSBNNJOHXJUI+%,'MPX"1*
 IUUQTDPNNVOJUZPSBDMFDPNEPDT%0$ ⿫罋

Slide 109

Slide 109 text

5IBOL:PV 랲䊛峔 吳䒭⠓爡'BCMJD !IZESBLFDBU https://github.com/hkurokawa https://speakerdeck.com/hkurokawa