Slide 1

Slide 1 text

ࡶͳ3FBDUJWF&YUFOTJPOT ೖ໳ !SFJ@N 4VQFSTIJQࣾ಺ษڧձ༻

Slide 2

Slide 2 text

ࣗݾ঺հ w SFJ@N w 4VOOZDIBU࡞ͬͯ·͢ w ͳΜ͔͍Ζ͍Ζ΍͖͚ͬͯͨ Ͳڈ೥͔Β"OESPJEͷਓ w J04΋࢝Ί͚ͨͲ9DPEFͱ༑ ୡʹͳΓ͖Εͳ͍

Slide 3

Slide 3 text

3Yʹ͍ͭͯ w ΋ͱ΋ͱ͸೥ʹ/FUքͰੜ·ΕͨϥΠϒϥϦɻʢ$ͷ-*/2͕ݯྲྀʣ w /FUqJY͕͜ͷϥΠϒϥϦΛ+BWBʹҠ২ͨ͠3Y+BWBΛ࢝Ίɺ3Y+4ɺ3Y4XJGUɺ 3Y"OESPJEͳͲ༷ʑͳݴޠɺϓϥοτϑΥʔϜʹ޿͕͍ͬͯΔɻ w 3FBDUͱ͔3FEVYͱ໊͔લ͕ࣅͯΔ͚Ͳ͋Μ·ؔ܎͸ͳ͍ɻ3FBDUJWF 1SPHSBNJOHͱ͍͏͘͘Γʹ͓͍ͯ͸஥ؒɻ

Slide 4

Slide 4 text

3FBDUJWF1SPHSBNJOHͱ͍͏ύϥμΠϜ w "ͷηϧΛΠϯΫϦϝϯτ͢Δͱ#ɺ$ɺ"ͷ஋΋มԽ͢Δ w ී௨ʹखଓ͖తʹίʔυΛॻ͍ͯ͸࠶ݱͰ͖ͳ͍ɻ0CTFSWFSύλʔϯΛ࢖ͬͯ"ͷ஋Λ؂ࢹ͢Δ Α͏ͳίʔυΛॻ͘ඞཁ͕͋Δɻ w 3FBDUJWF1SPHSBNJOH͸ʮมԽ͢Δঢ়ଶʯͷؔ܎ੑΛॻ͍͍ͯ͘͜ͱͰঢ়ଶΛίϯτϩʔϧ͢Δ 

Slide 5

Slide 5 text

࿩͸໭ͬͯ3Y w 3Y͸ঢ়ଶͷมԽΛ4USFBNͱͯ͠දݱ͢Δ w ొ৔͢Δͷ͸0CTFSWBCMFͱ0CTFSWFSΠϯλʔϑΣʔεɻ0CTFSWBCMF͸ྲྀΕͯ ͘Δσʔλɺ0CTFSWFS͸ྲྀΕͯ͘Δσʔλͷ؍ଌऀ w Ұ൪؆୯ͳϦετͷத਎Λ4USFBNʹม׵ͯ͠දࣔ͢Δྫʢ+BWBʣ -JTU*OUFHFSMJTU"SSBZTBT-JTU    
 0CTFSWBCMFGSPN MJTU TVCTDSJCF 4ZTUFNPVUQSJOUMO 
   

Slide 6

Slide 6 text

0QFSBUPSͰ஋ΛՃ޻͢Δ w ྲྀΕͯ͘ΔσʔλΛՃ޻͢Δྫʢ+BWBʣ w ΦϖϨʔλͷҰཡIUUQSFBDUJWFYJPEPDVNFOUBUJPOPQFSBUPSTIUNM List list = Arrays.asList(1, 2, 3, 4, 5, 6);
 Observable.from(list)
 .filter(v -> (v % 2) == 1)
 .map(v -> v * 2)
 .subscribe(System.out::println); 2 6 10

Slide 7

Slide 7 text

0CTFSWBCMFΛ߹੒͢Δ Observable stream1 = Observable.from(Arrays.asList(1, 2, 3));
 Observable stream2 = Observable.from(Arrays.asList(10, 20, 30));
 Observable.concat(stream1, stream2).subscribe(System.out::println); 1 2 3 10 20 30 Observable stream1 = Observable.from(Arrays.asList(1, 2, 3));
 Observable stream2 = Observable.from(Arrays.asList(10, 20, 30));
 Observable.zip(stream1, stream2, ((v1, v2) -> {
 return v1 + v2;
 })).subscribe(System.out::println); 11 22 33

Slide 8

Slide 8 text

ΠϕϯτΛ0CTFSWBCMFͱͯ͠ѻ͏ w ͜͜·Ͱͷ಺༰͸-JTUΛ4USFBNͱͯ͠ѻ͚ͬͨͩ w ϢʔβʔͷΠϕϯτΛ0CTBSWBCMFͰྲྀ͢ private Subscription subscription;
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { … // ͜͜ͰϘλϯΛ؂ࢹͯ͠ΠϕϯτΛྲྀ͢StreamΛ࡞Δ. subscription = RxView.clicks(view.findViewById(R.id.button)).map(v -> 1).subscribe(v -> {
 System.out.println("ԡ͞Εͯ " + v + "͕ྲྀΕ͖ͯͨΑ");
 }); } @Override
 public void onDestroyView() {
 super.onDestroyView();
 subscription.unsubscribe(); // View͕ഁغ͞ΕΔλΠϛϯάͰStreamͷߪಡΛղআͯ͠؂ࢹΛղ͘
 subscription = null;
 }

Slide 9

Slide 9 text

Ұ୴໭ͬͯ0CTFSWFSΠϯλʔϑΣʔεΛோΊΔ w 4USFBN͕ऴ୺ʹୡ͢ΔͱPO$PNQMFUFE͕૸ͬͯߪಡ͸VOTVCTDSJCF͞ΕΔ w 7JFXͷ৔߹͸ৗʹ؂ࢹ͞Ε͍ͯΔɺͭ·Γ4USFBN͸ແݶͰPO$PNQMFUFE͕૸Βͳ͍ͷͰࣗ෼ͰVOTVCTDSJCF͠ͳ͍ͱϦʔ Ϋ͢Δɻ public interface Observer {
 
 /**
 * Notifies the Observer that the {@link Observable} has finished sending push-based notifications.
 *


 * The {@link Observable} will not call this method if it calls {@link #onError}.
 */
 void onCompleted();
 
 /**
 * Notifies the Observer that the {@link Observable} has experienced an error condition.
 *


 * If the {@link Observable} calls this method, it will not thereafter call {@link #onNext} or
 * {@link #onCompleted}.
 * 
 * @param e
 * the exception encountered by the Observable
 */
 void onError(Throwable e);
 
 /**
 * Provides the Observer with a new item to observe.
 *


 * The {@link Observable} may call this method 0 or more times.
 *


 * The {@code Observable} will not call this method again after it calls either {@link #onCompleted} or
 * {@link #onError}.
 * 
 * @param t
 * the item emitted by the Observable
 */
 void onNext(T t);
 
 }

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

ࠓ·Ͱग़͖ͯͨ࿩ΛԠ༻͢Δ w શ߲໨Λೖྗͨ͠ΒϘλϯΛ༗ޮʹ͢Δͱ͍͏αϯϓϧ

Slide 12

Slide 12 text

private val subscriptions = CompositeSubscription()
 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
 
 val view = inflater.inflate(R.layout.fragment_rx_sample, container, false)
 
 // ֤ೖྗཝͷObservableΛऔಘ
 val observableName = RxTextView.textChanges(view.findViewById(R.id.edit_order_name) as AppCompatEditText)
 val observablePostalCode = RxTextView.textChanges(view.findViewById(R.id.edit_order_postal_code) as AppCompatEditText)
 val observableAddressFirst = RxTextView.textChanges(view.findViewById(R.id.edit_order_address_first) as AppCompatEditText)
 val observableAddressSecond = RxTextView.textChanges(view.findViewById(R.id.edit_order_address_second) as AppCompatEditText)
 
 // ButtonΛऔಘ
 val submitButton = view.findViewById(R.id.button_rx_submit) as AppCompatButton
 submitButton.isEnabled = false
 
 // ObservableΛcombineLatestʹ৯Θ֤߲ͯ͠໨ͷͲΕ͔ʹมߋ͕͋ͬͨ৔߹͸Stream͕ྲྀΕΔΑ͏ʹ͢Δ
 // Ҿ਺ͷ࠷ޙͷAction1ͰྲྀΕ͖ͯͨ஋ΛνΣοΫͯ͢͠΂ͯೖྗࡁͳΒtrueΛྲྀ͢
 subscriptions.add(Observable.combineLatest(observableName,
 observablePostalCode,
 observableAddressFirst,
 observableAddressSecond,
 { v1, v2, v3, v4 ->
 (0 < v1.length && 0 < v2.length && 0 < v3.length && 0 < v4.length)
 }).subscribe({ isValid ->
 // ྲྀΕ͖ͯͨStreamʹै͍Ϙλϯͷ༗ޮ/ແޮΛ੾Γସ͑Δ
 submitButton.isEnabled = isValid
 }))
 
 return view
 }
 
 override fun onDestroyView() {
 super.onDestroyView()
 subscriptions.unsubscribe()
 } w αϯϓϧίʔυ͸,PUMJO IUUQRJJUBDPNSFJNJUFNTBDCFCFDCGFDBD

Slide 13

Slide 13 text

"1*ͷϨεϙϯε0CTFSWBCMFͱͯ͠ѻ͏ w 3Y͸ඇಉظॲཧͱ૬ੑ͕͍͍ɻΞϓϦͰඇಉظͱ͍͑͹"1*ͷݺͼग़͠ɻ w "1*ΛݺΜͰͦͷϨεϙϯεΛ0CTFSWBCMFʹྲྀͯ͠ฦ͢ɻ w "1*΋TVCTDSJQUJPOͷ؅ཧ͸ͨ͠΄͏͕Α͍ɻ"1*ΛݺΜͰ݁ՌΛ7JFXʹදࣔ͢Δͱ͍͏Α͏ͳ͜ͱΛ͍ͯ͠Δ৔߹ɺ7JFX ͕ഁغ͞ΕΔλΠϛϯάͰVOTVCTDSJCF͠ͳ͍ͱ7JFXͷ/VMMࢀর͕ى͖Δʢ"1*ͷϦΫΤετதʹը໘͕ऴྃ͢ΔͳͲͯ͠ 7JFX͕ഁغ͞ΕΔέʔεʣՄೳੑ͕͋Δɻ w 0CTFSWBCMFͳͷͰ౰વɺ߹੒΍ม׵ͳͲͷPQFSBUPS͕࢖͑Δɻຊͷ"1*Λ౤͛ऴΘͬͨΒ࣍ʹߦ͘ɺΈ͍ͨͳॲཧ΋ 0CTFSWBCMFʹม׵ͯ͠ɺ[JQͰ߹੒ͯ͠TVCTDSJCF͢Ε͹؆୯ʹॻ͚Δɻ // ͜Ε͸Sunnychatͷྫ // getCanvas͸APIΛୟ͍ͯObservableΛฦ͢. subscriptions.add(canvasService.getCanvas(authToken, canvasIdentifier)
 .subscribeOn(Schedulers.newThread()) // ഑৴͸ผεϨουͰ
 .observeOn(AndroidSchedulers.mainThread()) // ߪಡ͸ϝΠϯεϨουͰ
 .subscribe({ // ͪ͜Β͸onNext
 onGetCanvasSuccess(it)
 }, { // ͪ͜Β͸onErrorɻωοτϫʔΫΤϥʔ΍200Ҏ֎ͷϨεϙϯεͷ৔߹͸഑৴ଆͰonError͕ݺ͹ΕΔ
 onGetCanvasFailure(it, canvasIdentifier)
 }))

Slide 14

Slide 14 text

·ͱΊ w 3FBDUJWF&YUFOTJPOͷߟ͑ํͱجૅʹ͍ͭͯ঺հ͠·ͨ͠ɻ w ϑϩϯτΤϯυͷ։ൃ͸ઈ͑ͣมԽ͠ଓ͚Δঢ়ଶͱͷઓ͍ͳͷͰ3YΛ࢖͏͜ͱͰ͍͍ײ͡ʹί ϯτϩʔϧ͠·͠ΐ͏ɻ