åã®èšäºã§ã¯ãéåžžã«ç°¡åã«ã¢ã¯ã»ã¹ã§ãããè¡šé¢ãSDKãã¥ãããã«ã€ããŠèª¬æããŸããã ä»åãæºã¯ããæ·±ããããè³¢ããããå ·äœçã«ãªããŸãã Retrofit 2ããã³Gsonã«é¢é£ããããã€ãã®ãã€ã³ãããããŸãã

1. GridLayoutã¯layout_weightã«å¿çããŸãã
ç¶æ³
æã ãæãæã£ããªããžã§ã¯ããäœæããéåžžã®æ¹æ³ãé©åã§ãªãããšããããŸãã
æ£èŠåœ¢

ãã®ãããªç¶æ³ã¯ãããšãã°ããã©ãŒã ã®æšªè¡šç€ºã§ãã ãã®å Žåã次ã®ãããªãã®ã欲ããã§ãã
暪åãã®ãã©ãŒã

50ãã50ã®åãã¢ã©ã€ã¡ã³ããäœæããæ¹æ³ã¯ïŒ ããã€ãã®åºæ¬çãªã¢ãããŒãããããŸãã
- ãã¹ããããLinearLayout
- RelativeLayout
- TableLayoutãŸãã¯GridLayout
ãã ãããããã«ã¯ãã¹ãŠæ¬ ç¹ããããŸãã
- LinearLayoutã®è±å¯ãã¯xml'kiã®å·šå€§ãããããã
ãç«ã®æ»ããããããŸãã - RelativeLayoutã¯ãå°æ¥ã®å€æŽãè€éã«ããŸãïŒãã©ãŒã å ã®è€æ°ã®è¡ã®ã¹ã¯ãããŸãã¯ã»ãã¬ãŒã¿ãŒã®è¿œå ã¯åãã¿ã¹ã¯ã«ãªããŸããView.setVisibilityïŒView.GONE ïŒã«ã€ããŠã¯å®å šã«é»ã£ãŠããŸãã
- ãŸãã誰ãTableLayoutã䜿çšããŸãã...ãŸãã¯åœŒãã¯ããã䜿çšããŸããããã£ãã«ãããŸããã ç§ã¯ãã®ãããªäººãç¥ããŸãã
ããã«ãæè»ãªèšèšãå®çŸããããã«ã 0dpãšweight = 1ã®æ°å€ã®ããžãã¯ã䜿çšããå¿ èŠãéåžžã«é »ç¹ã«ãããŸãã ããã§ã¯ã TableLayoutãRelativeLayoutã圹ç«ã¡ãŸããã TextView.setEllipsizeïŒïŒã®ãããªãã®ãåããŠäœ¿çšããããšãããšãåé¡ãšçã¿ãå§ãŸããŸãã
ãããŠãããããããªãã¯ç§ãå¥ã®èŠçŽ ãèŠéããŠããããšã«æ°ã¥ããã§ãããã GridLayoutãå©ãã«ãªãããã«æããŸããã layout_weightããããã£ããµããŒãããŠããªãããã ããã§ã圹ã«ç«ããªãã§ãããã ããã§ã¯ã©ãããŸããïŒ
解決ç
ãã°ããã®éãäœãããå¿ èŠã¯ãããŸããã§ãã-RelativeLayoutã§èŠããããã LinearLayoutã䜿çšããã ãããã°ã©ã ã§ãã¹ãŠãåããŸãïŒç¹ã«ç°åžžãªå ŽåïŒã
ãã ããããŒãžã§ã³21ã§ã¯ã GridLayoutããã£ãšlayout_weightããããã£ã®ãµããŒããéå§ããæãéèŠãªããšã«ã¯ããã®å€æŽãandroid.support.v7.widget.GridLayoutãšããŠAppCompatã«è¿œå ãããŸããïŒ
ããã«ã€ããŠïŒãããŠäžè¬çã«ã¯éåžžã®GridLayoutãèªåã®äœéãåã¿ããã£ããšããäºå®ã«ã€ããŠïŒç¥ããŸã§ã«ã ã¬ã€ã¢ãŠããå³ã«æ³³ãã çç±ãç解ããããšããŠïŒ ããã®ããã« ïŒå°ãªããšã1é±éãè²»ãããŸããã ãããããããã¯æãéèŠãªé©æ°ã®1ã€ã§ãããäœããã®çç±ã§ååãªæ³šæãæããã«æ®ããããã®ã§ãã 幞ããªããšã«ãstackoverflowïŒ 1ã2 ïŒã«å¯Ÿããåçã¯ãã§ã«è¿œå ããå§ããŠããŸãã
ãŸããæ°ããPercentRelativeLayoutãšPercentFrameLayoutã®ããŒãžã確èªããããšããå§ãããŸã-ããã¯æ¬åœã«ç匟ã§ãã ãã®ååã¯ããèªäœãè¡šããŠãããéåžžã«ã¬ã¹ãã³ã·ããªãã¶ã€ã³ãäœãããšãã§ããŸãã iOSã¯æè¬ããŸãã ãããŠãã¯ããããã¯AppCompatã«ãããŸãã
2. Fragment.isRemovingïŒïŒãšAcitivity.isFinishingïŒïŒã¯çããã§ããïŒ
ç¶æ³
PresenterManagerãã·ã³ã°ã«ãã³ïŒ MVPããã®æšæ¶ïŒãšããŠèšè¿°ããããšæã£ãããšããããŸãã Presenterãæéå ã«åé€ããã«ã¯ã Activity.isFinishingïŒïŒã䜿çšããŠãã¢ã¯ãã£ããã£å ã®id Presenterã®ãã©ã°ã¡ã³ããåéãããããšãšãã«åé€ããŸãã åœç¶ããã®ã¡ãœããã¯NavigationViewã®å Žåã¯ããŸãæ©èœããŸããã§ãã-ãã©ã°ã¡ã³ãã¯FragmentTransaction.replaceïŒïŒã«ãã£ãŠå€æŽããã Presenterãèç©ããããã¹ãŠãæµåºããŸããã
ã©ãŒããã°ãŒã°ã«ã§æ€çŽ¢ãããšã Fragment.isRemovingïŒïŒã¡ãœãããèŠã€ãããŸãããããã¯åãããšã§ããããã©ã°ã¡ã³ãã«å¯ŸããŠè¡ãããŸãã PresenterManagerã®ã³ãŒããæžãçŽããŠåãã§ããŸãã çµãã...
解決ç
...ç§ããããæ©èœãããããšãããšããç§ã®éããªç掻ãå§ãŸããŸããã æ£çŽãªãšãããç§ã¯ãã®æ¹æ³ãšãããè©ŠããŸãããããã®ã¡ãœããã®åäœã¯Activity.isFinishingïŒïŒãšã¯æ ¹æ¬çã«ç°ãªããŸãã Googleã¯ééã£ãŠããŸããã åæ§ã®åé¡ãçºçããå Žåã¯ã Fragment.isRemovingïŒïŒã䜿çšããåã«3åèããŠãã ããã ç§ã¯æ¬æ°ã§ãã ç»é¢ãå転ããããšãã¯ããã°ã«ç¹ã«æ³šæããŠãã ããã
ã¡ãªã¿ã«ã Acitivity.isFinishingïŒïŒã§ã¯ããã¹ãŠãããã»ã©ã¹ã ãŒãºã§ã¯ãããŸããïŒã¹ã¿ãã¯å ã®1ã¢ã¯ãã£ããã£ä»¥äžã§ã¢ããªã±ãŒã·ã§ã³ãæå°åããã¡ã¢ãªäžè¶³ãåŸ ã¡ãæ»ã£ãŠUp Navigationãš* voila *ïŒ..ã䜿çšããŸããããã¯ã ã¢ã¯ãã£ããã£ãäœæããç°¡åãªã¬ã·ãã§ããã isFinishingïŒïŒ== falseã¯ãäºåºŠãšè¡šç€ºãããªãã¢ã¯ãã£ããã£ã®å Žåã
UPD ïŒ bejibxãŠãŒã¶ãŒãæ£ããææããŠããããã«ã Activity.isFinishingïŒïŒã«é¢ããã³ã¡ã³ãã¯å®å šã«çå®ã§ã¯ãããŸããã çç±ãç解ããã«ã¯ãã³ã¡ã³ãã¹ã¬ãããèªãããšããå§ãããŸã ã
3. RecyclerViewã® ããããŒ/ããã¿ãŒ
ç¶æ³
ããŒãžããŒã·ã§ã³ãå®è£ ããéã®äžè¬çãªã¿ã¹ã¯ã¯ãæ°ããããŒã¿ã®ããŒãäžã«ProgressBarã衚瀺ããããšã§ãã
ListViewãšã¯ç°ãªãã RecyclerViewã«ã¯ã¯ããã«å€ãã®æ©èœããããŸããListViewã® é çã®çš®ãšæ¯èŒããŠã RecyclerView.Adapter.notifyItemRangeInsertedïŒïŒã®äŸ¡å€ã¯äœã§ãã ã
ãã ãããããžã§ã¯ãã§ListViewã®ä»£ããã«äœ¿çšããããšãããšãããã«å€ãã®ãã¥ã¢ã³ã¹ã«ééããŸããããããã£ListView.setDividerïŒïŒã¯ã©ãã«ãããŸããïŒ ListView.addHeaderViewïŒïŒã®ãããªãã®ã¯ã©ãã§ããïŒ ä»ã«äœãRecyclerView.Adapter.getItemViewTypeïŒïŒãªã©ããªã©ã
ãã®æ°ããæ å ±ã®ãã¹ãŠãåŠçããããšã¯é£ãããããŸããããäžå¿«ãªããšãæ®ã£ãŠããŸãã Divider / Headerãè¿œå ããã«ã¯ãã³ãŒãã®ã¯ã©ãŠããæžãå¿ èŠããããŸãã è€éãªã¬ã€ã¢ãŠãã«ã€ããŠã¯äœãšèšããŸããïŒ é³©ã¯ã4ã€ã®ç°ãªãããããŒãšããã¿ãŒãšã³ã³ãããŒã«ãåããRecyclerViewãå®è¡ããå¿ èŠããããŸããã æ²ãããŠèœèãããšèšã£ãŠã¿ãŸããããç§ã¯éåžžã«é·ãéæ©ããã
解決ç
å®éãäœãæ¢ãã¹ãããç¥ã£ãŠããã°ããã¹ãŠãããã»ã©æªãã¯ãããŸããã RecyclerViewã®äž»ãªåé¡ïŒããã³ãã®äž»ãªå©ç¹ïŒã¯ã RecyclerViewã§äœã§ãã§ããããšã§ãã å®è³ªçã«ã¹ã³ãŒãã¯ãããŸããã ããããåé¡ãç¶ããŸãã ããããŒãå¿ èŠãªå Žåã¯ãèªåã§å®è¡ããŠãã ããã ãããã幞ããªããšã«ãä»ã®äººããã§ã«ãã£ãŠããããèªåã§ãããã®ã§ãããã䜿ããŸãããã
å žåçãªåé¡ãšãã®è§£æ±ºçïŒ
- èŠçŽ ã®ã°ã«ãŒãã®èŠåºãïŒããšãã°ãèŸæžãAãã§ã¯ããã®æåã§å§ãŸããã¹ãŠã®åèªã®èŠåºãã«ãªããŸãïŒ-ãããè¡ãæãç°¡åãªæ¹æ³ã¯ã2çªç®ã®äžèŠãªViewHolderã¿ã€ããè¿œå ããã«ãåäžã®item-layoutã䜿çšããããšã§ãã çŸåšã®èŠçŽ ããããæåããå¥ã®æåãžã®é·ç§»ãããŒã¯ãã View.VISIBLEãä»ããŠã¬ã€ã¢ãŠãã«é ãããã¿ã€ãã«ãå«ããããšã確èªãããã§ãã¯ãè¿œå ããŸã ã
- ã·ã³ãã«ãªä»åã - ãã®ã³ãŒããã³ããŒããŠãããžã§ã¯ãã«è²Œãä»ããŸã ã äžèŠãªè©æ¬ºã¯ãããŸããã RecyclerView.addItemDecorationïŒïŒãä»ããŠåäœããŸã
- ããããŒ/ããã¿ãŒ/ãã©ãã°ã¢ã³ããããããªã©ãè¿œå ããŸãã -ãã³ã䜿çšããå Žåã¯ãæ°ããViewHolderããšã«æ°ããã¿ã€ããéå§ããïŒãå§ãããŸããïŒãã WrapperAdapterãå®è¡ããŸã ïŒã¯ããã«åªããŠããŸãïŒã ãããã ãããèŠãŠ ããæ°ã«å ¥ãã®ã©ã€ãã©ãªãéžæããããšããå§ãããŸãã å人çã«ã¯ã FastAdapterãšUltimateRecyclerViewã® 2ã€ãåæã«å¥œãã§ã
- ããŒãžããŒã·ã§ã³ãå¿ èŠã§ããã ããã°ã¬ã¹ ããŒã® ããããŒ/ããã¿ãŒãå°ç¡ãã«ããã®ã¯é¢åã§ã-Twitteréçºè ã®1人ã«ããããŒãžããŒã·ã§ã³ã©ã€ãã©ãªã§ãã
ç§ã«ãšã£ãŠã¯ãŸã è¬ã®ãŸãŸã§ã-SimpleDivider / SimpleHeaderAdapterãªã©ãäœæããããšãäžå¯èœã ã£ãçç± SDKã«çŽæ¥ïŒ
4. RecyclerView.Adapter.setHasStableIdsïŒïŒã«ããé«éå
圌ã®äœãåé¡ãªã®ã§ããïŒ
ããã¥ã¡ã³ããŒã·ã§ã³ã®äžè¶³ã»ã©åé¡ã§ã¯ãããŸããã ããã¯ãããèšãããšã§ãïŒ
ãã®ã¢ããã¿ãŒããããŒã¿ã»ããå ã®ç¹å®ã®äœçœ®ã«ããã¢ã€ãã ã®ããŒãšããŠæ©èœã§ããäžæã®longå€ãå ¬éããå Žåãtrueãè¿ããŸãã ãã®ã¢ã€ãã ãããŒã¿ã»ããå ã§åé 眮ãããå Žåããã®ã¢ã€ãã ã«å¯ŸããŠè¿ãããIDã¯åãã§ããå¿ èŠããããŸãã
ãããŠãããã§äººã ã¯2ã€ã®ã¿ã€ãã«åããããŸãã ãŸãããã¹ãŠãæ確ã§ãã 第äºïŒããã¯ã©ãããæå³ã§ããïŒ
åé¡ã¯ãããªããèªåãæåã®äººã«çŽ¹ä»ãããšããŠããããªãã¯è³ªåã«æ··ä¹±ãããããããªããšããããšã§ãïŒãªããã®æ¹æ³ãªã®ãïŒ ã¯ããäžæã®IDãè¿ããŸã ïŒ ç¥ã£ãŠããã ãããããªããããå¿ èŠãªã®ã§ããããïŒ ããããGoogleãéåžžã«éãã¹ã¯ããŒã«ãããšæžããŠããïŒããšããçãã¯ç§ã«ã¯åããªãã§ãããã
ãããŠãããã«ãããŸã
RecyclerView.Adapter.setHasStableIdsïŒïŒããã®å éã¯å®éã«ååŸã§ããŸããã1ã€ã®å Žåã«éããŸã-ã©ãã§ãRecyclerView.Adapter.notifyDataSetChangedïŒïŒã䜿çšããå ŽåïŒãããŠããã§ã¯ãå®å®IDãå¿ èŠãªçç±ãèšè¿°ããããã«èšèšãããŠããŸãïŒ ã éçããŒã¿ãããå Žåããã®ã¡ãœããã¯äœãæäŸãããå éšIDãã§ãã¯ã®ããã«å°ãé ããªãããšããããŸãã ãã®ããšã¯ãœãŒã¹ãèªãã åŸã«ããããããŸããã§ããããå°ãåŸã«ãã®èšäºãèŠã€ããŸããã
5. WebView
ç¶æ³
ã¿ã¹ã¯ã¯ããµãŒããŒããhtmlããã¹ããååŸããŠç»é¢ã«è¡šç€ºããããšã§ãã ããã¹ãã¯ããµãŒããŒãããïŒlt; htmlïŒgt;ããšããŠæäŸãããŸãã ã ããã ãã§ã ãããã¿ã¹ã¯å šäœã§ãã é£ããã§ããïŒ htmlãæ°è¡ã§è¡šç€ºã§ããWebViewããããŸãã ããã¯äœã§ããã TextViewã§ãã§ããŸãïŒ 1ã€ãŸãã¯2ã€ã§ãå®äºã§ã...ã¯ãïŒ..ãããïŒ..ãŸããããã§ããããïŒïŒ
解決ç
æ®å¿µãªãããããã§ã¯ãã¹ãŠãããã»ã©ã¹ã ãŒãºã§ã¯ãããŸããã
- ãŸããAndroid SDKã«ã¯HtmlUtils.unescapeïŒïŒã®ãããªã¡ãœããã¯ãããŸããã å¿ èŠãªå ŽåïŒlt; ã<ãã«å€ãããšãæãç°¡åãªæ¹æ³ã¯ïŒãã³ã§æ£èŠè¡šçŸãåŠæ¹ãã以å€ã«ïŒãApacheãStringUtils.unescapeHtml4ïŒïŒã«æ¥ç¶ããããšã§ãã
- 次ã®åé¡ã¯ãã¹ã¯ããŒã«æã®ã¢ãŒãã£ãã¡ã¯ãã§ãã ããªãçªç¶ïŒãããAndroid SDKïŒïŒã WebViewã¯é»ãç¹æ» ããŸãã äœããã¹ããã¯ãããšããã§èª¬æãããŠããŸã ã å人çã«ã¯ããããã®ã¢ãããŒãã®çµã¿åããã®ã¿ãå©ãã«ãªããŸããã
- ãããŠããã®ãããªåçŽãªã¿ã¹ã¯ã®åé¡ã«ãŸã é©ããŠããªãå Žåã¯ãããã§çµããã§ããhtmlããŒãžãã¬ã³ããªã³ã°ãããåã«ProgressBarã衚瀺ããå¿
èŠããããŸãã ãããŠãããã§ãã¹ãŠãæªãã§ãã ããã¯æ¬åœã«æªãã§ãã stackoverflowã§æ瀺ããããã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã¯ã1åããã«æ©èœãããããŸã£ããæ©èœããŸããïŒ tyk ã tyk ïŒã ãããŸã§åäœããŠããå¯äžã®ã¡ãœããã¯WebView.setPictureListenerïŒïŒã䜿çšããŠããŸããããçŸåšã§ã¯éæšå¥šãšå®£èšãããŠãããããã«ã€ããŠäœãããå¿
èŠã¯ãããŸãã ã
çµæãšããŠãã¢ããã€ã¹ã§ããã®ã¯ProgressBarãæŸæ£ããããšã ãã§ãã ãŸãã¯ããããæ¬åœã«ãæ¬åœã«ãæ¬åœã«ãã£ãã¡ãªå Žåã¯ã htmlã³ãŒãã«çŽæ¥è¿œå ãã javascriptã䜿çšããŠããŒãžã®æºåç¶æ³ã確èªããŸããããããããã¯ãã§ã«ãšãªãŒããã¶ãã¹ãã®ã¯ã©ãã®ããã§ãã
6. Gson ïŒ EnumSetãšããŠã®ããããã¹ã¯
ãã€/ã©ãã§/ãªãïŒ
ïŒç¶æ³ã¯ç¹å®ã®ãã®ã§ãããAndroidã®åé¡ã«ã¯çŽæ¥é©çšãããŸãããã次ã®æºã®åã«çš®ãšããŠè¿œå ããããšã«ããŸããïŒ
APIèŠæ±ã®1ã€ã«å¿çããŠã intã®åœ¢åŒã®ã¢ã¯ã»ã¹èš±å¯ã®ããããã¹ã¯ãå ¥ããŸãã ãã®ãã¹ã¯ã®èŠçŽ ãåŠçããå¿ èŠããããŸãã
æåã«é ã«æµ®ãã¶ã®ã¯ã intã®å®æ°ãšãã§ãã¯çšã®ãããæŒç®ã§ãã ãã¡ãããåžžã«æ©èœããŸãã ãããããã£ãšæ¬²ããå Žåã¯ã©ãããŸããïŒ EnumSetã¯ã©ãã§ããïŒ
ãåé¡ãããŸããã-ã²ããçãããç·ãçããŠãã¢ãã«ã®ã¢ãŒããã¯ãã£ãPOJOãModelãEntityãUiModel ããããŠåè«ã§ã¯ãªãã¬ãã«ã«åå²ããŸãã ããããããããªããæ ãè ã§ãäœèšãªããšãããããªããªãã ã¯ã©ã¹ïŒ ããã§äœïŒ
解決ç
@SerializedNameã® ããããã®ãããªãååã«æ³šæããŠãå¿ èŠãªåæåãäœæããŸãã
åæåã¢ã¯ã»ã¹
public enum Access { @SerializedName("1") CREATE, @SerializedName("2") READ; @SerializedName("4") UPDATE; @SerializedName("8") DELETE; }
jsonããEnumSetãžã®éã·ãªã¢ã«åçšã®JsonDeserializerãå®çŸ©ããŸã ã
EnumMaskConverter
public class EnumMaskConverter<E extends Enum<E>> implements JsonDeserializer<EnumSet<E>> { Class<E> enumClass; public EnumMaskConverter(Class<E> enumClass) { this.enumClass = enumClass; } @Override public EnumSet<E> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { long mask = json.getAsLong(); EnumSet<E> set = EnumSet.noneOf(enumClass); for (E bit : enumClass.getEnumConstants()) { final String value = EnumUtils.GetSerializedNameValue(bit); assert value != null; long key = Integer.valueOf(value); if ((mask & key) != 0) { set.add(bit); } } return set; } }
ãããŠGsonã«è¿œå ããŸã ïŒ
Gsonbuilder
GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter((new TypeToken<EnumSet<Access>>() {}).getType(), new EnumMaskConverter<>(Access.class)); Gson gson = gsonBuilder.create();
ãã®çµæïŒ
䜿çšãã
class MyModel { @SerializedName("mask") public EnumSet<Access> access; } /* ...some lines later... */ if (myModel.access.containsAll(EnumSet.of(Access.READ, Access.UPDATE, Access.DELETE))) { /* do something really cool */ }
7. ã¬ãããã£ãã ïŒ @GETãªã¯ãšã¹ãã®åæ
ç¶æ³
ã»ããã¢ããããå§ããŸãããã Gsonã¯ä»¥åãšåæ§ã«åœ¢æãããŸãã ã¬ãããã£ããã¯æ¬¡ã®ããã«äœæãããŸãã
æ°ããRetrofit.BuilderïŒïŒ
retrofit = new Retrofit.Builder() .baseUrl(ApiConstants.API_ENDPOINT) .client(httpClient) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build();
ããŒã¿ã¯æ¬¡ã®ããã«ãªããŸãã
åæã·ãŒãºã³
public enum Season { @SerializedName("3") AUTUMN, @SerializedName("1") SPRING; }
Gsonãéåžžã®@SerializedNameãä»ããŠåæåã解æããæ©èœã®ãããã§ãããããçš®é¡ã®è¿œå ã¬ã€ã€ãŒã¯ã©ã¹ãäœæããå¿ èŠæ§ãåãé€ãããšãå¯èœã«ãªããŸããã ãã¹ãŠã®ããŒã¿ã¯ãèŠæ±ããããã«Modelã«éãããŸãã ãã¹ãŠé 調ã§ãïŒ
æ¹é ãµãŒãã¹
public interface MonthApi { @GET("index.php?page[api]=selectors") Observable<MonthSelector> getPriorityMonthSelector(); @GET("index.php?page[api]=years") Observable<Month> getFirstMonth(@Query("season") Season season); }
ç³èŸŒã¿
class MonthSelector { @SerializedName("season") public Season season; } /* ...some mouses later... */ MonthSelector selector = monthApi.getPriorityMonthSelector(); Season season = selector.season; /* ...some cats later... */ Month month = monthApi.getFirstMonth(season);
ãããŠä»ã芪æãªãå°é家ã泚æã¯åé¡ã§ãïŒ äœãããŸããããããªãæ©èœããªãã®ã§ããïŒ
解決ç
ããã§ã¯ããããæ©èœããŠããªããšããæ å ±ãç¹ã«çç¥ããŸããã å®éããã°ãèŠããšã monthApi.getFirstMonthïŒseasonïŒãªã¯ãšã¹ãã¯index.phpãšããŠåŠçãããŸããïŒããŒãž[api] = yearsïŒseason_lookup = AUTUMN ...ããããšãäœãããŠããŸããïŒã-ç§ã¯èšããŸãã ããªãã®çãã¯äœã§ããïŒ ãªããã®ãããªçµæã§ããïŒ ãŸã æšæž¬ããŠããŸãããïŒ ãã®åŸããããããŸãã
ãã®ã¿ã¹ã¯ã«åºãããããšãã1ã€ã®ããšãç解ããããã«ãœãŒã¹ã§æ€çŽ¢ããã®ã«æ°æéããããŸããïŒãããã¯èŠããŠããããšãããããŸãïŒïŒã¯ãã Gsonã¯@GET / @POSTããã³ä»ã®åæ§ã®_ãªã¯ãšã¹ã_ãéä¿¡ãããšãã«äœ¿çšãããŸããïŒ å®éãæåŸã«index.phpã®ãããªãã®ãèŠãã®ã¯ãã€ã§ããïŒããŒãž[api] = yearsïŒseason_lookup = {aïŒ123; bïŒ321} ïŒ æå³ããããŸãã Retrofit 2ã¯Bodyã®å€ææã«ã®ã¿Gsonã䜿çšããŸããããªã¯ãšã¹ãèªäœã«ã¯äœ¿çšããŸããã æåŸã«ïŒ ã¡ããã©season.toStringïŒïŒã䜿çšãããŸã-ãããã£ãŠãçµæã§ãã
ãã ãããªã¯ãšã¹ãã§Gsonãä»ããå€æã§enum
8. åŸä»ã ïŒ èªèšŒããŒã¯ã³è»¢é
ãããŠæåŸã«ãç§ã¯ãã®ããã«æžããŠãã人ã«äžã€ã®ããšãèšãããã§ãïŒ
ã¬ãããã£ãããµãŒãã¹
public interface CoolApi { @GET("index.php?page[api]=need") Observable<Data> just(@Header("auth-token") String authToken); // ^ auth-token @GET("index.php?page[api]=more") Observable<Data> not(@Header("auth-token") String authToken); // ^ auth-token @GET("index.php?page[api]=gold") Observable<Data> doIt(@Header("auth-token") String authToken); // ^ auth-token 101 ! }
ãã§ã«Interceptorã®äœ¿çšãéå§ããŠãã ããïŒ Retrofitã¯éåžžã«äœ¿ããããã®ã§ãããã¥ã¡ã³ããèªã人ã¯ããªãããšãç解ããŠããŸããã3æé座ã£ãŠauth-tokenããã ãã§ãªããããŸããŸãªç¹å®ã®current_locationãbattery_levelãbusy_statusããã³ãŒããæ¶å»ãããšã æ²ãã¿ãè¿œãã€ããŸãïŒè»¢éããçç±ãå°ããªãã§ãã ããïŒãã¹ãŠã®ãªã¯ãšã¹ãã§battery_levelã§ããã·ã§ãã¯ãåããŠããŸãïŒã ããªãã¯ããã§ããã«ã€ããŠèªãããšãã§ããŸã ã
çµè«ã®ä»£ããã«
ããŠãä»åã¯äºå®ãããã¯ããã«å€ãã®ããã¹ãããããŸããã ããŸãããããããªããã¥ããããæšãŠãå¿ èŠããããŸããããä»ã®ãã¥ãããã¯æ¬¡ã«åºãããããšã«ããŸããã
åã®ããŒããšã¯éã«ãä»åã¯ãæåã«ã°ãŒã°ã«ã§æ€çŽ¢ãããã®ã§ã¯ãªãããŸãããªããããããã®ãããšèããŸããã åé¡ãSDKãŸãã¯ã©ã€ãã©ãªã«ãã£ãŠäœæãããã®ã§ã¯ãªããããã°ã©ãèªèº«ã«ãã£ãŠäœæãããããšããããŸãããæ®å¿µãªããšã«ããã®å Žåã¯ãã¹ãŠãããã«æªåããŸãã éžæããããŒã«ãéå°è©äŸ¡ããªãã§ãã ããããŸããé倧è©äŸ¡ããªãã§ãã ããã
äžè¬ã«ãAndroidã奜ããªå ŽåããAndroidã䜿çšããå Žåã¯ãåžžã«ã°ããŒãã«ãã¬ã³ãã«ã€ããŠææ¡ããŠãã ãã ã ããŠããŸãã¯ãã䟿å©ãªãã¥ãŒã¹ãªãœãŒã¹ã«ã€ããŠã¯ãã¡ããã芧ãã ãã ã ããã§ã¯ã Android SDK ã 人æ°ã®ããã©ã€ãã©ãªãªã©ã«é¢ããå€ãã®æ å ±ãèŠã€ããããšãã§ããŸãã