ãããããããªããäœãã§ããå Žæãç¥ã£ãŠããæŽåçãªãµã€ã³ãã¹ãå䌎ãããã®ããã«ã³ãŒããæžããŠãã ããããããŒãã£ã³ã»ãŽãŒã«ãã£ã³ã°
GooglePlacesAPIã䜿çšããŠãããžã§ã¯ãã®1ã€ãéçºãããšããAndroidã¢ããªã±ãŒã·ã§ã³ãšãµãŒããŒAPIéã®ãããã¯ãŒã¯çžäºäœçšãæŽçããåé¡ããããŸããã AsyncTaskã®çŽèŠ³ãšã麺ãã¯ããã®çš®ã®çžäºäœçšãæŽçããä»ã®æ¹æ³ãããã¹ãã ãšç€ºåããŸããã ããã§ãç§ã¯CommandProcessorãã¶ã€ã³ãã¿ãŒã³ã«åºäŒããŸããã Androidã¢ããªã±ãŒã·ã§ã³ã§ã®ãã®ãã¶ã€ã³ãã¿ãŒã³ã®äœ¿çšã«ã€ããŠã話ããããšæããŸãã
ãŸãã解決ããå¿
èŠãããåé¡ã«ã€ããŠèª¬æããŸãã Google Places APIã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãäœæãããŠãŒã¶ãŒãéžæãããããäžã®ä»»æã®å Žæã®ãã¬ãã¥ãŒã衚瀺ãããŠãŒã¶ãŒã詳现ãªæ
å ±ïŒããšãã°ãããå€ãã®ç»åã衚瀺ïŒãååŸããå Žåãéžæããå Žæã®æå®ãããIDã«ç»åãèªã¿èŸŒã¿ããã¹ãŠã®ç»åãæ¢ã«è¡šç€ºããå¿
èŠããããŸããéžæããå Žæã«é¢é£ããŠããŸãã åœæã®ç§ã«ãšã£ãŠæãæçœãªæ¹æ³ã¯ãAsyncTaskã䜿çšããããšã§ããã ããããããã€ãã®è©Šã¿ã®åŸããã䟿å©ãªä»ã®æ¹æ³ãããã¯ãã§ããããšãæããã«ãªããŸããã AsyncTaskã䜿çšãããšã次ã®çç±ã§äžäŸ¿ã§ããã
1ïŒå Žæã®ãã¬ãã¥ãŒãååŸããã«ã¯ããŸãããŠãŒã¶ãŒãéžæããå Žæã®é£ã«ãããã¹ãŠã®å Žæã«é¢ããæ
å ±ãååŸããããèŠæ±ããå¿
èŠããããŸããã
2ïŒåä¿¡ããIDãã©ãŒã ã«åºã¥ããŠãåçãã¬ãã¥ãŒã®ãªã¯ãšã¹ããéä¿¡ããŸãã
3ïŒãã¬ãã¥ãŒãã¯ãªãã¯ãããšããã®å Žæã«é¢é£ãããã¹ãŠã®åçã衚瀺ãããŸãã
ãããã£ãŠãAsyncTaskã䜿çšãããšãç¹å®ã®ããŠã©ãŒã¿ãŒãã©ãŒã«ããååŸãããããAsyncTaskãå¥ã®AsyncTaskå
ã§äœ¿çšããå¿
èŠããããŸãã ãããŠãã°ãŒã°ã«ã§èª¿ã¹ããšãäžèšã®ã¿ã¹ã¯ã«å¯ŸåŠããã³ãã³ãããã»ããµãã¿ãŒã³ã«é¢ããæ
å ±ãèŠã€ãããŸããã
CommandProcessorãã¶ã€ã³ãã¿ãŒã³ã¯ããµãŒãã¹ãªã¯ãšã¹ããšãã®å®è¡ãåé¢ããŸãã ãã¿ãŒã³ã®äž»èŠã³ã³ããŒãã³ãã§ããCommandProcessorã¯ãèŠæ±ã管çããå®è¡ãã¹ã±ãžã¥ãŒã«ããè¿œå ã®ãµãŒãã¹ãæäŸããŸããããšãã°ãå®è¡ã®é
延ãèŠæ±ã®ãã£ã³ã»ã«ãªã©ã®èŠæ±ã®ä¿åã§ãã [1]ããåŒçšããå³ã¯ããã¿ãŒã³ã®ã³ã³ããŒãã³ãéã®é¢ä¿ã瀺ããŠããŸãã
ãã¿ãŒã³ã®ç¯å²
- ãŠãŒã¶ãŒãã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã·ã¹ãã ãšå¯Ÿè©±ããããã°ã©ã ã äŸïŒããã¹ããšãã£ã¿ãŒããªãã£ã¹ã¢ããªã±ãŒã·ã§ã³ã ã³ãã³ãïŒä»¥éãã³ãã³ãã¯ã¯ãšãªãšåãïŒã¯ããŠãŒã¶ãŒãããŠã¹ãã¿ã³ããããããŒãã¡ãã¥ãŒãã¿ã³ãªã©ãæŒããåŸã«äœããã®ã¿ã¹ã¯ãå®è¡ããããã«äœ¿çšãããŸãã ã³ãã³ãã¯ãå®è¡ã®ããã«ããã»ããµã«æž¡ããããªããžã§ã¯ãã§ãã
- åæ£ã·ã¹ãã ãŸãã¯äžŠåã·ã¹ãã ã ãã®ãã¿ãŒã³ã䜿çšãããšãã³ãã³ããéä¿¡ããŠå¥ã®ã¹ã¬ããã§å®è¡ã§ããŸãã ã³ãã³ããªã©ã®ãã¥ãŒãäœæããŸãã
- ãããã¯ãŒã¯ãšå¯Ÿè©±ããã¢ããªã±ãŒã·ã§ã³ã
å®è£
次ã«ããã®ãã¿ãŒã³ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãç¹ã«Androidã¢ããªã±ãŒã·ã§ã³ã®éçºã«é©çšããæ¹æ³ãèŠãŠã¿ãŸãããã IntentServiceãŸãã¯HaMeRãã¬ãŒã ã¯ãŒã¯ïŒHandlerãMessagesãRunnableïŒã䜿çšããããšãã§ããŸããããã®ãã¿ãŒã³ããã¹ãã¢ããªã±ãŒã·ã§ã³ã«å®è£
ããæ¹æ³ãèŠãŠã¿ãŸãããã ãã®ããããã¹ãã¢ããªã±ãŒã·ã§ã³ã¯ãç¹å®ã®ã«ãŒãã«å«ãŸããã«ãŒããšå Žæã®ãªã¹ãã衚瀺ããŸãã ãããã£ãŠãTracksRequestãšPlacesRequestã®2çš®é¡ã®ãªã¯ãšã¹ãïŒã³ãã³ãïŒããããŸãã äž¡æ¹ã®ã¯ã©ã¹ã¯ãããã»ããµãŒïŒCommandProcessorïŒã«ãã£ãŠåŠçãããããã«ãCommonRequeståºæ¬ã¯ã©ã¹ã®åå«ã§ãã
ãã¹ãŠã®äœæ¥ã¯sendAsyncPlaceRequestã¡ãœããã§è¡ãããŸããAPIãªã¯ãšã¹ãã®URLãäœæããæ°ããã¹ã¬ãããäœæããå¿çã解æããŠããã³ãã©ãŒã䜿çšããŠã³ã³ãããŒã©ãŒã«çµæãæž¡ãããšãã§ããŸãã
private void sendAsyncPlaceRequest(final int id){ Thread background = new Thread(new Runnable() { @Override public void run() { String response = sendRequest(getUrl(id)); List<Place> places = new ArrayList<>(); try { places = getPlacesFromJson(response); } catch (JSONException e) { Log.e("JSONException", e.getMessage()); } handler_.sendMessage(handler_.obtainMessage(States.PLACES_WERE_FOUND,places)); } }); background.start(); }
次ã«ããªã¯ãšã¹ãã管çããŠå®è¡ããCommandProcessorã¯ã©ã¹ãå®è£
ããå¿
èŠããããŸãã
publicclassRequestProcessor { private UpdateCallbackListener clientActivity_; public RequestProcessor(UpdateCallbackListener clienActivity) { this.clientActivity_ = clienActivity; }
ããã§ãç¶æ
ã«å¿ããŠãããã»ããµã«ç°ãªãã³ãã³ããéä¿¡ããã³ã³ãããŒã©ãŒãå¿
èŠã§ãã èŠæ±ã®çµæã¯ããã³ãã©ãŒã䜿çšããŠã¹ããªãŒã ããéä¿¡ãããŸãã
public class MessageController extends Handler { private static MessageController instance = null; private RequestProcessor processor_; public void init (UpdateCallbackListener listener) { processor_ = new RequestProcessor(listener); } public static MessageController getInstance(){ if (instance == null){ instance = new MessageController(); } return instance; } public void handleMessage(Message msg) { switch (msg.what) { case States.INIT_REQUEST: CommonRequest request = (CommonRequest)msg.obj; processor_.execute(request); break; case States.REQUEST_COMPLETED: List<Result> results = (List<Result>)msg.obj; processor_.updateActivity(results); break; default: break; } } }
ã¢ã¯ãã£ããã£ã§ã®äœæ¥çµæãè¿ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæŽæ°ããããã«updateUIïŒïŒãåŒã³åºãïŒListViewã®å
¥åããããäžã®ããŒã«ãŒã®æç»ãªã©ïŒã«ã¯ãUpdateCallbackListenerã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ããå¿
èŠããããŸãã
public interface UpdateCallbackListener { void onUpdate(List<? extends Result> results); }
ãããŠããããã¢ã¯ãã£ããã£ã«å®è£
ããŸãã
public void onUpdate(List<? extends Result> results){ tracks_ = (List<Track>) results; TrackAdapter trackAdapter = new TrackAdapter(this,tracks_); listView_.setAdapter(trackAdapter); }
ãªã¯ãšã¹ããžã®å¿çã§çµæãè¿ãããåŸïŒããšãã°ããã®ã«ãŒãã«æ²¿ã£ããã¹ãŠã®ãã¬ã€ã¹ã®ãªã¯ãšã¹ãïŒãã¢ã»ãããæŽæ°ãããã¬ã€ã¹ãªããžã§ã¯ããã¢ããã¿ã«è»¢éããå¿
èŠããããŸãã processor_.updateActivityïŒplacesïŒã¡ãœãããä»ããŠãããè¡ãããšãã§ããŸãããã®ã¡ãœããã¯ããã®ã¡ãœãããå®è£
ããã¢ã¯ãã£ããã£ã§onUpdateïŒïŒãåŒã³åºããŸãã [1]ããåã£ã次ã®å³ã¯ããã¿ãŒã³ã®åäœã®ãã€ããã¯ã¹ã瀺ããŠããŸãã
ãªã¯ãšã¹ããéå§ããã«ã¯ãã¢ã¯ãã£ããã£ã§TracksRequestãªããžã§ã¯ããäœæãããããã³ã³ãããŒã©ãŒã«æž¡ãå¿
èŠããããŸãã
controller_ = MessageController.getInstance(); controller_.init(this); TracksRequest tracksRequest = new TracksRequest(controller_); controller_.sendMessage(controller_.obtainMessage(States.INIT_REQUEST,tracksRequest));
IntentServiceã䜿çšããå®è£
IntentServiceã䜿çšãããšããã®ãã¿ãŒã³ãå®å
šã«å®è£
ããããšãã§ããŸãã å³ãèããŠãã ããïŒ
Intentãã³ãã³ããªããžã§ã¯ããšããŠäœ¿çšããããã»ããµã«æž¡ãããšãã§ããŸãã Creatorã¯ã¢ã¯ãã£ããã£ã§ãããã³ãã³ããªããžã§ã¯ããäœæãããã®ãªããžã§ã¯ãããšã°ãŒãã¥ãŒã¿ãã€ãŸããã®å Žåã¯IntentServiceã«æž¡ããŸãã ãããã£ãŠãCommandProcessorã®åœ¹å²ã¯ãCustomIntentServiceã¯ã©ã¹ãã€ãŸãonHandleIntentïŒïŒã¡ãœããã«ãã£ãŠå®è¡ãããŸããonHandleIntentïŒïŒã¡ãœããã¯ãIntentã«å«ãŸããããŒã¿ã«å¿ããŠãããŸããŸãªæäœãå®è¡ã§ããŸãã ãã®å Žåãçµæãã¢ã¯ãã£ããã£ã«è¿ãã«ã¯ãBroadcastReceiverã䜿çšã§ããŸãã
é ãè¿œã£ã説æ
ãããã£ãŠãèŠçŽãããšããã®ãã¿ãŒã³ãå®è£
ããã«ã¯ã以äžãå®è¡ããå¿
èŠããããŸãã
- æœè±¡ã³ãã³ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãåã
ã®ã³ãã³ãã®å®è£
ãã«ãã»ã«åããŸãã ç§ãã¡ã®å Žåãããã¯sendRequestïŒint iïŒã¡ãœããã§ãããåã³ãã³ãïŒãªã¯ãšã¹ãïŒã¯å¥ã
ã«å®è£
ãããŠããŸããã
- ããŒã ãçµæãåŒã³åºãå
ã«è¿ãæ¹æ³ã決å®ããŸãã ãã®ããã«ãåã¢ã¯ãã£ããã£ã«onUpdateïŒïŒã¡ãœããã䜿çšããŠãUpdateCallbackListenerã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ããŸããã
- åããŒã ãå®è£
ããŸãã ãªã¯ãšã¹ãã«ã¯2çš®é¡ãããŸãã1ã€ã¯ã«ãŒãã«é¢ããæ
å ±ãåä¿¡ããããïŒTracksRequestïŒããã1ã€ã¯å Žæã«é¢ããæ
å ±ãåä¿¡ããããïŒPlacesRequestïŒã§ãã
- ã³ãã³ããéä¿¡ããã³ã³ãããŒã©ãŒãå®è£
ããŸãã ã³ãã³ãã®äœæãšéä¿¡ã¯ãAbstract FactoryãŸãã¯Prototypeã䜿çšããŠå®è£
ã§ããŸãã ãã ããã³ã³ãããŒã©ãŒãã³ãã³ãã®äœæè
ã§ããå¿
èŠã¯ãããŸããã äŸãããããããã«ããªã¯ãšã¹ããªããžã§ã¯ãã¯ã¢ã¯ãã£ããã£ã§äœæãããŸããã
- ã³ãã³ããšããã»ã¹ãåãåãããã»ããµã¯ã©ã¹ãå®è£
ããŸãã ãªã¯ãšã¹ãããšã«ãRequestProcessorã¯ã©ã¹ã¯executeïŒïŒã¡ãœãããå®è¡ããŸãã
ãã¿ãŒã³ã®é·æãšçæã
å©ç¹ïŒ- ããã¹ããšãã£ã¿ãªã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç°ãªãã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãåãã³ãã³ãã䜿çšã§ããŸãã ããšãã°ããäœæãã¡ãã¥ãŒã®ãã¿ã³ãšãã³ã³ããã¹ãã¡ãã¥ãŒã®åãååã®ãã¿ã³ã¯ãåãã³ãã³ãã«ã¢ã¯ã»ã¹ã§ããŸãã
- èŠæ±ã®çµæã«å¿ããŠãéåæèŠæ±ãéä¿¡ããåŒã³åºãã®é åºãå¶åŸ¡ããæ©èœã
- æ¢åã®æ©èœãæãªãããšãªããæ°ããã³ãã³ãïŒãªã¯ãšã¹ãïŒã®åœ¢ã§æ°ããæ©èœãè¿œå ããéã®æè»æ§ã æ°ããã³ãã³ããå€æŽãŸãã¯è¿œå ããŠããã³ãã³ããã³ãã©ãŒã«ã¯åœ±é¿ããŸããã
- ç°ãªãã¯ã©ã€ã¢ã³ãïŒãã®å Žåãã¢ã¯ãã£ããŒã·ã§ã³ïŒã¯åãã³ãã³ãã䜿çšã§ããŸãã ããšãã°ãIDã«ããã€ã¡ãŒãžã®ããŠã³ããŒãèŠæ±ã¯ãããŸããŸãªã¢ã¯ãã£ããã£ã«äœ¿çšã§ããŸãã
çæïŒ- ããã«ãåç¶æ
ã远跡ããããã«å¿ããŠåŠçããå¿
èŠããããŸãã
- ããŒã ã®æ°ã¯éåžžã«å€ããªãå¯èœæ§ããããŸã
- åæ¹åéä¿¡ã ã¢ã¯ãã£ããŒã·ã§ã³ãèŠæ±ã®äœæãéå§ããå¿çãåä¿¡ãããåŸãçµæãã¢ã¯ãã£ããŒã·ã§ã³ã«è¿ãå¿
èŠããããŸãã
ãããã«
ãããããäœããã®åœ¢ã§ããã§ã«ãã¿ãŒã³ã®å®è£
ãèŠãŠããŸããã ããããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ã®ããŒãã¯éåžžã«éèŠã§ããããããã®èšäºã圹ã«ç«ãŠã°å¹žãã§ãã å°æ¥çã«ã¯ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®éçºã§äœ¿çšãããããã€ãã®ãã¿ãŒã³ãæ€èšããäºå®ã§ãã ã³ã¡ã³ãã«è³ªåãæžããŠãåŸã§ãŸãäŒããŸãããã
ãœãŒã¹ã®ãªã¹ã
[1]ãã¿ãŒã³æåãœãããŠã§ã¢ã¢ãŒããã¯ãã£ããªã¥ãŒã 1.ãã°ã©ã¹ã·ã¥ãããããã€ã±ã«ã¹ã¿ã«ããã³ã¹ããŒããŒãããã©ã³ã¯ããã·ã¥ãã³
[2] Command Revisited
www.dre.vanderbilt.edu/~schmidt/PDF/CommandRevisited.pdfGithubãã¹ããããžã§ã¯ãïŒ
github.com/GregaryMaster/CommandProcessor