Androidオールスターズ 2015/8/8 の資料です
Web Api ClientΛߟ͑ΔAndroidΦʔϧελʔζ 2015/8/8 #dotsandroid@__gfx__ at Cookpad, Inc.
View Slide
Introduction to myself• github:gfx, twitter:__gfx__, FUJI Goro• ΫοΫύουॴଐ• ΫοΫύουΞϓϦͷϦϦʔεཧɾϝϯςφϯεΛओʹ͍ͯ͠Δ• ࠲ӈͷʮਖ਼͍͠ίʔυΛॻ͜͏ɻಈ͘ίʔυͰຬͤͣʹʯ
ϥΠϒϥϦͷબఆํ• Android൛ΫοΫύουΞϓϦͰ࠾༻͍ͯ͠Δٕज़ͷݱঢ়֬ೝ http://techlife.cookpad.com/entry/2015/06/25/093507• “ΫοΫύουͷΣϒαʔϏεಉ༷ʹɺϞόΠϧΞϓϦͷ։ൃ͜ͷઌ10Ҏ্ଓ͘Ͱ͠ΐ͏ɻ͕ٕͨͬͯ͠ज़બͷجຊతͳࢦʹ͓͍ͯɺ͜ͷઌ10ؒܧଓͯ͠ϝϯςφϯε͓Αͼߋ৽͍ͯ͘͜͠ͱ͕Ͱ͖Δ͔Ͳ͏͔͕ॏཁͰ͢ɻ”
Web Api Client
ͳͥWeb Api Client͕ॏཁͳͷ͔• ଟ͘ͷεϚϗΞϓϦɺWeb APIͷΠϯλʔϑΣΠεʹ͗͢ͳ͍• Cookpadྫ֎Ͱͳ͘ɺΞϓϦجຊతʹJSONΛฦ͢Web APIͷΠϯλʔϑΣΠεͰ͋Δ• Ώ͑ʹWeb Api ClientͰ͏Http ClientΛԿʹ͢Δ͔ඇৗʹॏཁ
༻ޠ• Web Api Client• υϝΠϯݻ༗ͷWeb ApiΛݺͼग़͢ΫϥεϥΠϒϥϦ• Picasso, GlideͳͲͷը૾μϯϩʔμWeb Api ClientͷҰछ• ϨϕϧHttp Client• HTTPΛ࣮ͨ͠ΫϥεϥΠϒϥϦ• Apache HTTP client, HttpURLConnection, OkHttpͳͲ• ߴϨϕϧHttp Client• ϨϕϧHttp ClientΛϥοϓ͍ͯͨ͘͢͠͠ΫϥεϥΠϒϥϦ• Volley, RetrofitͳͲɻWeb Api Clientͱͷ۠ผᐆດͳ͜ͱ͕͋Δ
ϨϕϧHttp Clientੇධ
Apache HTTP Client• AndroidʹΈࠐ·ΕͨϨϕϧHttp Client• DEPRECATED! DEPRECATED! DEPRECATED!• ΈࠐΈ൛ͱϦϦʔε൛ͷဃ͕େ͖͍• multipart requestͳͲมΘͬͨ͜ͱΛ͢ΔʹΈࠐΈ൛ͰΓͣɺదͳόʔδϣϯͷϦϦʔε൛ίϯϙʔωϯτΛ͏ඞཁ͕͋Δ• ͳͥAndroid frameworkʹΈࠐΜͩͷͩ…
HttpURLConnection• Javaඪ४ΫϥεϥΠϒϥϦͷHttp Client• యܕతͳ͍ํͰΩϟετ͕ඞཁͱ͍͏ҟৗͳઃܭ• (HttpURLConnection) url.openConnection();• ΠϯλʔϑΣΠεHTTPΛӅṭ͍͔͗ͯͯ͢͠Γʹ͍͘• Android 4.4Ҏ߱όοΫΤϯυ࣮͕OkHttpʹͳ͕ͬͨɺ͜Ε͕ΩϟογϡपΓʹόά͕͋ΓΫϥογϡ͢ΔͷͰΘͳ͍΄͏͕ແ
OkHttp• Squareࣾ։ൃͷϨϕϧHttp Client• HTTP/2αϙʔτ• ಉظAPIͱඇಉظAPI྆ํ͋Δ• ͳͥ྆ํ༻ҙͨ͠͠…͜Εͷ͍ͤͰʢ͈́• AndroidΈࠐΈͰͳ͍ͷ͕େ͖ͳϝϦοτ• ࣮ߦ͞ΕΔίʔυΛશʹ༧ଌͰ͖Δʂʂʂ
ཧతͳϨϕϧHttp Client• ϚϧνεϨουΛѻΘͳ͍͜ͱ• ฒྻϦΫΤετͳͲΑΓ্ҐϨΠϠͰΔ͖• ͨͩ͠εϨουηʔϑͰ͋Δ͖• pure JavaͰ࣮͠ɺAndroid frameworkͷHttp Clientʹґଘ͠ͳ͍͜ͱ
ߴϨϕϧHttp Clientੇධ
Volley• 2013ͷGoogle I/O ʹͯክͷΑ͏ʹݱΕͨߴϨϕϧHttp Client• AndroidքͷελϯμʔυʹͳΔ͔ͱࢥΘΕ͕ͨ…
VolleyͷΑ͍ͱ͜Ζ• HttpStackʹΑΓɺϨϕϧHttp ClientΛΓସ͑Մೳ• Apache HTTP Client, HttpURLConnection (Hurl), OkHttp(via okhttp-urlconnection)• RequestQueueΫϥεʹΑΓɺHttpStackʹ͢લͷϦΫΤετΩϡʔΛࡉ੍͔͘ޚՄೳ• ΫοࣾͷෳࡶͳೝূγεςϜΛ௨աͤ͞Δͷʹ͜Ε͕ඞཁͩͬͨͨΊ࠾༻• ͞·͟·ͳίϯϙʔωϯτ͕֦ுՄೳ
Volleyͷμϝͳͱ͜Ζ• Ϋϥεଟ͗͢ɺ࣮ෳࡶ͗͢ɺ֦ு͕͗͢͠• ϦΫΤετΛΦϯϝϞϦͰॲཧ͢ΔઃܭͳͨΊɺը૾ΞοϓϩʔυΛ͠Α͏ͱ͢Δͱॲཧ͕ෳࡶͰόοΫΤϯυͷHttp Clientʹґଘ͕ͪ͠• ࠓdeprecatedͱͳͬͨApache HTTP Clientͷߏମ܈ͱີ݁߹͍ͯͯ͠Γ͕͠ࠔ
Retrofit• SquareࣾͷߴϨϕϧHttp Client• interfaceΛఆٛ͢Δ͚ͩͰWeb Api ClientΛ࡞Ͱ͖Δ• RxJavaΠϯλʔϑΣΠε݉Ͷඋ͍͑ͯΔ
Retrofitͷ͍͍ͱ͜Ζ• దͳσϑΥϧτͰΑ͠ͳʹಈ͘• interfaceΛఆٛ͢Δ͚ͩͰWeb Api ClientΛੜͰ͖Δ• ͔͠RxJavaΠϯλʔϑΣΠε͋Δ• όοΫΤϯυͷϨϕϧHttp ClientΛΓସ͑ΒΕΔ• ΠϯλʔϑΣΠεඇৗʹ୯७Ͱ࣮͍͢͠
Retrofitͷμϝͳͱ͜Ζ• Web Api ClientΛΞϊςʔγϣϯͱϦϑϨΫγϣϯͰ੍ޚ͍ͯ͠ΔͨΊ࣮Λ͍ʹ͍͘• ͍ͣΕ੩తίʔυੜܕʹͳΕ͋Δఔղফ͢Δ͔• “Request”ͷΑ͏ͳ൚༻తͳ໊લΛ͍͗͢ʢOkHttpͱඃͬͯΔʣ• σϑΥϧτʮݡ͍ʯ͕దͱݶΒͳ͍• OkHttpRxJava͕ར༻Մೳ͔Ͳ͏͔ͰৼΔ͍͕มΘΔ• ϦΫΤετΛॲཧ͢ΔσϑΥϧτͷExecutor͕cached thread poolexecutorsͳͷͰεϨουΛ࡞Γ͗͢ΔՄೳੑ͕͋Δ
ཧతͳߴϨϕϧHttp Client• ʮݡ͍σϑΥϧτʯෆཁ• ͋ΔϥΠϒϥϦ͕ೖ͍ͬͯΔͱৼΔ͍͕มΘΔͳͲ࠷ѱ• AndroidϦιʔε͕গͳ͍͜ͱʹཹҙ͢Δ• εϨουΛͲ͏͏͔ɺΞϓϦ͔Β੍ޚͰ͖Δ͔Ͳ͏͔ௐͨ΄͏͕Α͍• ϦΫΤετͱϨεϙϯεͷஔ͕Ͱ͖Δ͔Ͳ͏͔• ෳࡶͳೝূΛ௨աͰ͖Δ͔Ͳ͏͔
Thread Pool
εϨουϓʔϧͳͥॏཁ͔• HTTPϦΫΤετΛฒྻͰ࣮ߦ͢ΔͨΊʹ͏• 1ͭͷը໘Λ࡞ΔͨΊʹෳͷϦΫΤετ͕ඞཁͳ߹ɺྻ࣮ߦͩͱ1ͭͷϦΫΤετͷॲཧʹֻ͕͔࣌ؒͬͯΞϓϦશମ͕͘ͳΔ• ฒྻʹϦΫΤετΛ࣮ߦ͢Δͱɺ͍ϦΫΤετʹҾ͖ͣΒΕΔ߹͍͕খ͘͞ͳΔ
εϨουϓʔϧʹ͍ͭͯ• AndroidͰ࡞ΕΔThread1000~10000ݸఔ• ্ݶʹୡ͢ΔͱΞϓϦ͕ٸࢮ͢Δࣄ͕͋ΔͷͰnew Thread() ةݥ• ͦ͜ͰεϨουϓʔϧͰεϨουΛ͍·Θ͢• Web Api ClientฒྻϦΫΤετͷͨΊʹεϨουϓʔϧΛ͏
ϦΫΤετ1SJPSJUZ#MPDLJOH2VFVF55ISFBE 5ISFBE 5ISFBEϨεϙϯε5ISFBE1PPM*NQMFNFOUBUJPO
Thread PoolͷͦΕͧΕͷ࣮• OkHttp - ҙͰඪ४Cached Thread Pool• Retrofit - ඪ४Cached Thread Pool• Volley - ಠ࣮ࣗͷFixed Thread Pool• Picasso - ඪ४Fixed Thread Pool• ੍ޚՄೳ͕࣮ͩʹΑͬͯσϑΥϧτ͕ҧ͏ͷͰҙ
java.util.concurrent.Executors• εϨουϓʔϧΛੜ͢Δඪ४ΫϥεϥΠϒϥϦ• newCachedThreadPool() - ඞཁͳ͚ͩεϨουΛ࡞Γ࠶ར༻͢ΔεϨουϓʔϧʢεϨουͷ্ݶͳ͠ͳͷͰةݥʣ• newFixedThreadPool() - εϨουݻఆͷεϨουϓʔϧ
Thread Pool ϕετϓϥΫςΟε• ϨϕϧHttp ClientεϨουϓʔϧΛ࣋ͨͣɺߴϨϕϧHttp Client͕࣋ͭ• σϑΥϧτʹཔΒͣΞϓϦ͕executorΛੜͯ͢͠• εϨουΛ࡞Γա͗ͳ͍Fixed Thread PoolΛ͏• IOόϯυͷ߹εϨου3͘Β͍ͰΑͦ͞͏
݁• ݱঢ়ͩͱOkHttp + Retrofit͕Αͦ͞͏• RetrofitͷσϑΥϧτεϨουϓʔϧʹҙ• ͱ͍͑RetrofitΘΓͱෆຬ͕͋ΔͷͰͲ͏͠Α͏͔ͳͱ͍͏ؾ࣋ͪ
That’s all.• Any questions?• ͜ΜͳͷศརͩΑͱ͍͏͕͋Ε @__gfx__·Ͱڭ͍͑ͯͩ͘͞ʂʂʂ