Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rx入門

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

 Rx入門

Reactive Extensions入門。社内勉強会用。

Avatar for Rei Matsushita

Rei Matsushita

August 10, 2016
Tweet

More Decks by Rei Matsushita

Other Decks in Technology

Transcript

  1. 0QFSBUPSͰ஋ΛՃ޻͢Δ w ྲྀΕͯ͘ΔσʔλΛՃ޻͢Δྫʢ+BWBʣ w ΦϖϨʔλͷҰཡIUUQSFBDUJWFYJPEPDVNFOUBUJPOPQFSBUPSTIUNM List<Integer> 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
  2. 0CTFSWBCMFΛ߹੒͢Δ Observable<Integer> stream1 = Observable.from(Arrays.asList(1, 2, 3));
 Observable<Integer> stream2 =

    Observable.from(Arrays.asList(10, 20, 30));
 Observable.concat(stream1, stream2).subscribe(System.out::println); 1 2 3 10 20 30 Observable<Integer> stream1 = Observable.from(Arrays.asList(1, 2, 3));
 Observable<Integer> stream2 = Observable.from(Arrays.asList(10, 20, 30));
 Observable.zip(stream1, stream2, ((v1, v2) -> {
 return v1 + v2;
 })).subscribe(System.out::println); 11 22 33
  3. ΠϕϯτΛ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;
 }
  4. Ұ୴໭ͬͯ0CTFSWFSΠϯλʔϑΣʔεΛோΊΔ w 4USFBN͕ऴ୺ʹୡ͢ΔͱPO$PNQMFUFE͕૸ͬͯߪಡ͸VOTVCTDSJCF͞ΕΔ w 7JFXͷ৔߹͸ৗʹ؂ࢹ͞Ε͍ͯΔɺͭ·Γ4USFBN͸ແݶͰPO$PNQMFUFE͕૸Βͳ͍ͷͰࣗ෼ͰVOTVCTDSJCF͠ͳ͍ͱϦʔ Ϋ͢Δɻ public interface Observer<T> {


    
 /**
 * Notifies the Observer that the {@link Observable} has finished sending push-based notifications.
 * <p>
 * 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.
 * <p>
 * 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.
 * <p>
 * The {@link Observable} may call this method 0 or more times.
 * <p>
 * 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);
 
 }
  5. 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
  6. "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<CanvasEntity>Λฦ͢. subscriptions.add(canvasService.getCanvas(authToken, canvasIdentifier)
 .subscribeOn(Schedulers.newThread()) // ഑৴͸ผεϨουͰ
 .observeOn(AndroidSchedulers.mainThread()) // ߪಡ͸ϝΠϯεϨουͰ
 .subscribe({ // ͪ͜Β͸onNext
 onGetCanvasSuccess(it)
 }, { // ͪ͜Β͸onErrorɻωοτϫʔΫΤϥʔ΍200Ҏ֎ͷϨεϙϯεͷ৔߹͸഑৴ଆͰonError͕ݺ͹ΕΔ
 onGetCanvasFailure(it, canvasIdentifier)
 }))