Our SuccessKnowledges
NEXTZY Logo
Crews
Chat
Talk with Team
NEXTZY Logo
NEXTZY
Chat
Home>Knowledges

「 RxJava 101 Concept 」จากงาน Droidcon Bkk งานจบแต่ความรู้ไม่จบ

Share:

「 RxJava 101 Concept 」จากงาน Droidcon Bkk งานจบแต่ความรู้ไม่จบ

Table of contents

  • RxJava 101 Concept
  • Start
  • Main Concept
  • Document
  • Example in Real world
  • Schedulers (threading)
  • Tips
  • Conclustion
  • Link ไว้ศึกษาต่อ
Nonthawit

Nonthawit

CEO | Engineer | Designer

VIEW

1,911

CATEGORY

Culture,Technical

LAST UPDATED

March 26, 2017

Nonthawit

Nonthawit

CEO | Engineer | Designer

VIEW

1,911

CATEGORY

Culture,Technical

LAST UPDATED

March 26, 2017

เนื่องจากมีคนสรุปงานกันไปเยอะและ 555 เราขอแหวกแนวเลือกซัก 1 เรื่องมาเจาะกันไปเลยจะมีทั้งความรู้ของ speaker และส่วนของเจ้าของบล็อครวมกันไปด้วยเลย น่าจะครบสำหรับ 101 (มั้ง) ไว้เอาไปต่อยอดใช้กัน 😎 เราเลยขอตั้งชื่อบทความนี้ว่า

RxJava 101 Concept

ซึ่ง speaker หลักคนที่พูดเรื่องนี้คือ

เฮียแกพูดถึงการใช้ RxJava ทั้ง basic การใช้งาน และยกตัวอย่างการใช้ Rx ในโปรเจคจริงๆ

Start

โดยปกติถ้าเราไม่ใช้ Rx หน้าตา method เวลาเรา get ค่าบางอย่างจะมีอยู่หลักๆ 3 ทางที่เป็นไปได้เนาะ คือ

ซึ่งมันมีปัญหาหลักๆคือ

  1. การทำ chain method ค่อนข้างลำบาก ไม่งั้นต้องลงเอยด้วย callback ทำให้มันเริ่มเยอะขึ้นเรื่อยๆ โค๊ดก็รกรุงรังอีก
  2. ดัก error ลำบากต้องมานั่ง review โค๊ดว่ามีโอกาสที่จะเกิด error ในส่วนไหนบ้าง
  3. ถ้าต้องการยิงการทำงานไปที่ background task ต้องสร้าง Asyntask นู่นนั่นนี่เต็มไปหมด ค่อนข้างลำบากเลยทีเดียว

ซึ่ง RxJava ตอบโจทย์เรื่องพวกนี้ได้เป็นอย่างดีที่สำคัญโค๊ด clean ขึ้นเยอะ และยังทำอะไรที่มากกว่าการ get ค่าธรรมดาๆได้อีกเยอะมาก

Main Concept

แต่การที่จะใช้ RxJava ได้ ในโลกของ Rx เราต้องมองทุกอย่างเป็น data steam ซึ่งจะทำอย่างนั้นได้เราต้อง “หุ้ม” ข้อมูลด้วย Observable เสียก่อน เพื่อให้ข้อมูลมีลักษณะเป็น data steam ก่อน

Rx จึงมี method ที่สร้างตัว Observable มากมายซะเหลือเกิน 😅 ซึ่งเราเรียกมันว่า Operator ข้อดีคือเราสามารถใช้ operator ต่อกันได้มากกว่า 1 operator เช่น

Observable
.fiter(...)
.flatMap(...)
.reduce(...);

และ operator ไม่ได้มีไว้หุ้มข้อมูลอย่างเดียวนะ แต่ละ operator มันมีหน้าที่ของมันด้วยเราต้องเข้าใจก่อนใช้ เช่น

Observable.filter(article -> article.name); //lambda syntax
filter เฉพาะตัวแปรชื่อ name ออกมาเป็น Observable<String> เพื่อเอาไปใช้ต่อ

http://reactivex.io/documentation/operators.html

NOTE: แต่ไม่ต้องห่วงเพราะหลักๆ basic เราใช้กันอยู่ไม่กี่ตัว

จาก 3 วิธีเหลือแค่ 1 วิธีในการ get ค่าบางอย่างออกมา แค่ต้องทำให้มันเป็น Observable ก่อน

แน่นอนว่าวิธี get ค่าจึงต้องต่างออกไปจากเดิม เราจึงต้องสร้างสิ่งที่เรียกว่า Subscriber/Observer (ผู้สังเกตการณ์) มา subscribe เพื่อดึงข้อมูลจาก observable แทนการ get ค่าธรรมดาๆนั่นเอง

เวลาเราเรียก Observable.subscribe(…) (ในที่นี้คือ article( ).subscriber(…) เพราะ article( ) return เป็น observable ออกมา) การทำงานต่างๆจะเริ่ม execute ณ ตอนที่เราเริ่ม subscribe นะ แล้วเราจะได้ Subscription ออกมาด้วยเป็น object ที่เก็บ state ต่างๆของการ subscribe ตอนนั้นๆ

เสร็จแล้วข้อมูลจะเริ่มถูก emit จาก observable แล้วเข้า onNext(…) ไปเรื่อยๆจนครบ onCompleted( ) จะถูกเรียก ถ้าในระหว่างนั้นมีการเกิด error ขึ้นไม่ว่ากรณีใดๆจะเข้า onError(…) ให้ทันทีง่ายต่อการ handle

NOTE: จะเห็นว่า concept คล้าย loop วนไปเรื่อยๆเนาะ

เผื่อจะงงกันเราขอวาดเป็นแผนภาพดังนี้

3 concept for RxJava

NOTE: จากโค๊ดข้างบนเวลาเราใช้ Rx ใน android lifecycle เราควร s.unsubscribe( ) ทิ้งทุกครั้งเพื่อกัน Memory leak

Document

http://reactivex.io/documentation/observable.html

รูปข้างบนอธิบายวิธีอ่าน Document ว่าแต่ละอย่างมันคืออะไร

ให้ง่ายไปอีกมีคนทำ app สำหรับดูตัวอย่าง Rx ด้วยนะ

แนะนำให้ Download ติดไว้อ่านเวลาว่างๆแทนการเล่น facebook เนาะ 👍

RxMarbles - Android Apps on Google Play
The key to understanding ReactiveX Observable operators.play.google.com
RxMarbles on the App Store
Read reviews, compare customer ratings, see screenshots, and learn more about RxMarbles. Download RxMarbles and enjoy…itunes.apple.com

เป็นเว็บก็มีนะ

RxMarbles: Interactive diagrams of Rx Observables
Learn, build, and test Rx functions on Observablesrxmarbles.com

Example in Real world

วิธี create observable แบบง่ายๆ

ต่อไปตัวอย่างยากขึ้นมาหน่อยน่าจะครอบคลุมการใช้งาน operator ใน Rx เบื่องต้นได้ดี

โจทย์

เรามีร้านขายของ ที่ต้องการจะนับ stock สินค้าต่างๆแยกตาม TagId

อันดับแรกเราต้องโยน Observable<ArticleQuantity> เข้ามาใน method ก่อน

เสร็จแล้วเริ่ม filter → เป็น operator ใช้ filter ค่าต่างๆออกมาอันนี้ตรงไปตรงมาก read more

ในส่วนนี้เรา filter เฉพาะตัวแปร isInStock คือสินค้ายังมี stock อยู่ เสร็จแล้วเราจะได้ Observable<String> เพื่อเอาไป groupBy ต่อ

groupBy → เป็น operator ใช้สร้าง group ของ observable read more

ในส่วนนี้มี articleIdFromTag(String) เพื่อรวม article ที่มี TagId เดียวกันไว้ใน observable ตัวเดียว ซึ่งสุดท้ายเราจะได้ group ของ observable ไปใช้ต่อใน flatMap

flatMap → read more

ในส่วนนี้เราใช้ flatMap เพื่อเริ่มนับจำนวน article ในแต่ละ group ที่ได้มาจาก groupBy

map → เป็น operator ที่เราสามารถใช้ map ค่าต่างๆตามที่เราต้องการ read more

ในที่นี้เราต้องการแปลงให้เป็น ArticleQuantity ก่อน

reduce → read more

ในส่วนนี้เราจะเริ่ม sum ทุกๆ article ในแต่ละ group และ สร้างเป็น new ArticleQuantity( … , … ) ใหม่ 1 group/ArticleQuantity

จะทำอย่างนี้ไปเรื่อยๆจนครบทุก list เราจะได้เป็น Observable<ArticleQuantity> แยกตาม TagId พร้อมจำนวนที่เรานับ ไปใช้งานต่อได้แว้ววว

มันอาจจะดูงงๆอยู่บ้าง แนะนำให้ทำความเข้าใจให้ได้เนาะ

Schedulers (threading)

ในโลกของ Rx เราสามารถยิงการทำงานต่างๆไป background thead ได้ง่ายมาก ทำให้เราไม่จำเป็นต้องใช้ AyncTask หรือ Thread.start( ) อีกต่อไป




.subscribeOn(Schedulers.id())

.observeOn(AndroidSchedulers.mainThread())
    .flatMap(...);

NOTE: มีประโยนช์มากกับการทำงานบางอย่างที่ทำงานบน UiThread ไม่ได้เราต้องยิงไป background ก่อนแล้วค่อยกลับมา update UI

Tips

ถ้าเกิดกรณีที่มี chain operator เยอะๆแบบ 4 5 ตัวต่อกัน แนะนำให้สร้าง method มาครอบเพื่อให้ง่ายต่อการทำความเข้าใจครับ

อย่างที่เราเคยบอกเวลาใช้ Rx ใน android lifecycle นั้นไม่ว่าจะเป็น Activity หรือ Fragment เราควร unsubscribe ทิ้งด้วยเพื่อกัน memory leak ด้วย แล้วถ้า subscriber มากกว่า 1 ตัวหละ? ก็ต้องไปนั่งไล่ unsubscribe ทุกตัวดูลำบาก เราจึงอยากแนะนำให้สร้างตัวเก็บ subscriber ชื่อ CompositeSubscribtion ไว้เพื่อที่เวลาจะ unsubscribe สั่งแค่บรรทัดเดียวเลยจบ คือ

mSubscribtions.clear();

ในกรณีนี้อย่าใช้ mSubscribtions.unsubsribe( ); ธรรมดานะ อันนี้ต้องระวัง เพราะ state ของตัว subscriber ยังคงอยู่ใน CompositeSubscribtion เวลา Activity/Fragment เกิดตายเวลากลับมา add ใหม่มันจะมองว่า state ยังค้างอยู่มันจะ unsubsribe( ); ทันทีทำให้เรางงกันว่า เอ๊ะ!! ทำไม Rx ไม่ทำงานจริงๆมันทำงานครับแต่ state มันค้างอยู่ ต้องสั่ง clear( );

Conclustion

  • Don’t try to go all out “reactive” อย่าใช้ RxJava ทั้ง project เพราะบางอย่างมันไม่จำเป็นขนาดนั้น
  • Apply where it makes sense ให้ใช้ที่มันจำเป็นจริงๆ เช่น Domain layer/Business logic, REST call (Retrofit)
  • Its takes time to practice so take small steps learning it
  • RxJava is a difference way of doing things. It’s very powerful มีหลากหลายวิธีมากในการใช้ RxJava ทำให้มันมีประสิทธิภาพมากๆ
  • 5 operator that you must understand first คือ groupBy, filter, map, flatMap, reduce ควรทำความเข้าใจเป็นอย่างยิ่งเพราะใช้บ่อย แล้วค่อยต่อยอดไปใช้ operator อื่นๆ 😎
RxJava for the Rest of Us
The Reactive Extensions for the JVM, better known as RxJava, have become a popular tool in Android development over the…realm.io

Link ไว้ศึกษาต่อ

คนเขียนก็หน้าตาหล่อพอๆกันครับมีหลายตอนด้วย

[Android Code] มารู้จักกับ RxJava และ RxAndroid กันเถอะ [ตอนที่ 1]
ณ เวลานี้นอกจาก Kotlin แล้ว ก็คงไม่พ้น ReactiveX นี่แหละที่เป็นสิ่งที่นักพัฒนาหลายๆคนพูดถึงกัน บอกเลยว่ามันมาแรงมากกกก…www.akexorcist.com

วันนี้ไว้แค่นี้ครับเจอกันบล็อคหน้า

อย่าลืม share ให้มนุษย์ RxJava คนอื่นด้วยหละ 😎

Share:

KNOWLEDGE

Related Articles

เข้าใจการทำ Selector แบบ Ripple effect
Nonthawit

Nonthawit

CEO | Engineer | Designer

เข้าใจการทำ Selector แบบ Ripple effect

20 สิ่ง ที่ได้หลังจากเป็น Android developer ที่ Nextzy 3 เดือน
Nonthawit

Nonthawit

CEO | Engineer | Designer

20 สิ่ง ที่ได้หลังจากเป็น Android developer ที่ Nextzy 3 เดือน

บทความนี้แชร์ประสบการณ์ 3 เดือนแรกของการทำงานเป็น Android Developer ที่ Nextzy ครอบคลุมทั้งด้าน technical เช่น MVP architecture, Android Lifecycle, ProGuard, Git workflow และการเขียน Unit Test รวมถึงด้าน soft skill อย่างการสื่อสารกับทีม, การแชร์ความรู้, และการเขียนโค้ดให้ readable และยืดหยุ่น นอกจากนี้ยังสะท้อนวัฒนธรรมองค์กรที่เน้นทีมเวิร์ค การ review โค้ด และบรรยากาศการทำงานที่สนุกสนาน ซึ่งล้วนช่วยลด learning curve และพัฒนาทักษะได้เร็วกว่าการเรียนรู้คนเดียว

[Tip/Trick] วิธีติดต่อกับ WebView ผ่าน JavascriptInterface มันเท่มาก
Nonthawit

Nonthawit

CEO | Engineer | Designer

[Tip/Trick] วิธีติดต่อกับ WebView ผ่าน JavascriptInterface มันเท่มาก

NEXTZY Logo
NEXTZY
48/27 Ratchadaphisek Rd, Samsen Nok, Huai Khwang, Bangkok 10310

Base at Thailand

Thailand

Home

Crews

Success

Download press kits

Knowledges

Chat

Talk with team

SCHEDULE