ããã«é¢ãã1ã€ã®èšäºïŒ
274635 ïŒã§ããªããžã§ã¯ãã
onRestoreInstanceState
ããã«
onRestoreInstanceState
ãã
onSaveInstanceState
ã«è»¢éããããã®å¥åŠãªãœãªã¥ãŒã·ã§ã³ã瀺ãããŸããã
android.os.Parcel
ã¯ã©ã¹ã®
writeStrongBinder(IBInder)
ã¡ãœããã䜿çšããŸãã
ãã®ãããªãœãªã¥ãŒã·ã§ã³ã¯ãAndroidãã¢ããªã±ãŒã·ã§ã³ãã¢ã³ããŒããããŸã§æ£ããæ©èœããŸãã ãããŠã圌ã«ã¯ãããè¡ãæš©å©ããããŸãã
...ã·ã¹ãã ã¯ãä»ã®ãã©ã¢ã°ã©ãŠã³ããŸãã¯å¯èŠããã»ã¹ã®ã¡ã¢ãªãåå©çšããããã«ããã®ããã»ã¹ãå®å
šã«çµäºããå ŽåããããŸã...
ïŒ http://developer.android.com/intl/en/reference/android/app/Activity.html ïŒ
ãã ããããã¯ãã€ã³ãã§ã¯ãããŸããã ïŒãã®ãããªåèµ·ååŸã«ã¢ããªã±ãŒã·ã§ã³ããã®ç¶æ
ã埩å
ããå¿
èŠããªãå Žåããã®ãœãªã¥ãŒã·ã§ã³ãé©ããŠããŸãïŒã
ãããããã®ãããªãã·ãªã¢ã©ã€ãºäžå¯èœãªããªããžã§ã¯ãã䜿çšãããç®çã¯ãç§ã«ã¯å¥åŠã«æããŸããã ããã§ãã¢ããªã±ãŒã·ã§ã³ã®è¡šç€ºç¶æ
ãæŽæ°ããããã«ãéåææäœãã
Activity
ã«åŒã³åºãã転éããŸãã
ç§ã¯ãã€ããSmalltalk以æ¥ãã©ããªéçºè
ããã®å
žåçãªèšèšäœæ¥ãèªèãããšæã£ãŠããŸããã ããããç§ã¯ééã£ãŠããããã§ãã
ææŠãã
- ãŠãŒã¶ãŒããã®ã³ãã³ãïŒ
onClick()
ïŒã§ãéåææäœãéå§ããŸã - æäœãå®äºãããã
Activity
çµæã衚瀺ããŸã
ç¹åŸŽ
- æäœã®å®äºæã«è¡šç€ºããã
Activity
ã¯
- ããŒã ãæ¥ãã®ãšåã
- åãã¯ã©ã¹ã®å¥ã®ã€ã³ã¹ã¿ã³ã¹ïŒç»é¢ã®å転ïŒ
- å¥ã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ïŒãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã§å¥ã®ç»é¢ã«åãæ¿ããïŒ
- æäœãå®äºãããšãã¢ããªã±ãŒã·ã§ã³ã®åäžã®
Activty
ã衚瀺ãããªãããšãå€æããå ŽåããããŸã
åŸè
ã®å Žåã次å
Activity
éãããšãã«çµæã衚瀺ãããŸãã
解決ç
MVCïŒã¢ã¯ãã£ãã¢ãã«ä»ãïŒããã³ã¬ã€ã€ãŒã
詳现ãªãœãªã¥ãŒã·ã§ã³
èšäºã®æ®ãã®éšåã§ã¯ãMVCãšã¬ã€ã€ãŒã«ã€ããŠèª¬æããŸãã
å
·äœäŸãæããŠèª¬æããŸãã ã¢ããªã±ãŒã·ã§ã³ãé»åãã¥ãŒãžã®é»åãã±ããããäœæããå¿
èŠããããŸãã
- ãŠãŒã¶ãŒã¯éè¡æ¯åºã«å
¥ããã¢ããªã±ãŒã·ã§ã³ã®ããã±ãããååŸããã¿ã³ãã¯ãªãã¯ããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ãµãŒããŒã«ãªã¯ãšã¹ããéä¿¡ãããã±ãããåä¿¡ããŸãã
- ãã¥ãŒãéããšãã¢ããªã±ãŒã·ã§ã³ã¯é£çµ¡ããå¿
èŠããããŠã£ã³ããŠã®çªå·ã衚瀺ããŸãã
éåææäœã䜿çšããŠãµãŒããŒãããã±ãããåãåããŸãã ãŸããéåææäœã¯ãã¡ã€ã«ãããã±ãããèªã¿åãïŒåèµ·ååŸïŒããã¡ã€ã«ãåé€ããŸãã
ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã¯ãåçŽãªã³ã³ããŒãã³ãããæ§ç¯ã§ããŸãã äŸïŒ
- ãã±ãããé
眮ãããã³ã³ããŒãã³ãïŒ
TicketSubsystem
ïŒ - ãã±ããã衚瀺ããã
TicketActivity
ããã³ããã±ãããTicketActivity
ããã¿ã³ - ãã±ããã®ã¯ã©ã¹ïŒãã±ããçªå·ãåºåç³èŸŒæ
å ±ããŠã£ã³ããŠçªå·ïŒ
- éåæãã±ããååŸã®ã¯ã©ã¹
æãèå³æ·±ãã®ã¯ããããã®ã³ã³ããŒãã³ããã©ã®ããã«çžäºäœçšãããã§ãã
ã¢ããªã±ãŒã·ã§ã³ã«ã¯ã TicketSubsystem
ã³ã³ããŒãã³ããå«ããå¿
èŠã¯ãããŸããã ãã±ããã¯
éçãã£ãŒã«ãTicket.currentTicket
ããŸãã¯Ticket.currentTicket
ã¯ã©ã¹android.app.Application
ãã£ãŒã«ãã
ãã ãããã®æ¡ä»¶ã¯ãããŒã«ãå®è¡ã§ãããªããžã§ã¯ãããã®ãã±ããã§ãã/ãªãããšã§ããããšãéåžžã«éèŠã§ã
MVC
-ã€ãŸãããã±ããã衚瀺ãããïŒãŸãã¯çœ®ãæããããïŒãšãã«éç¥ãçæããŸããTicketSubsystem
ã
MVC
芳ç¹ããã¢ãã«ã«ãããšã
Activity
ã¯ã€ãã³ãããµãã¹ã¯ã©ã€ãããããŒãæã«ãã±ãã衚瀺ãæŽæ°ã§ããŸãã ãã®å Žåã
Activity
ã¯
MVC
芳ç¹ãã
View
ãšããŠæ©èœã
View
ã
ãã®åŸãéåææäœãæ°ãããã±ãããååŸãã¯ãåä¿¡ãããã±ããã
TicketSubsystem
èšé²ããã ãã§ãä»ã®ããšãå¿é
ããå¿
èŠã¯ãããŸããã
ã¢ãã«
æããã«ããã±ããã¯ã¢ãã«ã§ãªããã°ãªããŸããã ãã ããã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã±ããã空äžã«ãåãããããšã¯ã§ããŸããã ããã«ããã±ããã¯æåã¯ååšãããéåææäœã®å®äºæã«ã®ã¿è¡šç€ºãããŸãã ãã®ããšããããã±ãããé
眮ãããã¢ããªã±ãŒã·ã§ã³ã«ã¯äœãä»ã®ãã®ããªããã°ãªããªãããšãããããŸãã ããã
TicketSubsystem
ãŸãã ãã±ããèªäœãäœããã®æ¹æ³ã§æ瀺ããå¿
èŠããããããã
Ticket
ã¯ã©ã¹ã«ããŸãã ãããã®ã¯ã©ã¹ã¯äž¡æ¹ãšããã¢ã¯ãã£ããªã¢ãã«ã®åœ¹å²ãæããããšãã§ããå¿
èŠããããŸãã
ã¢ã¯ãã£ããªã¢ãã«ãæ§ç¯ããæ¹æ³
ã¢ã¯ãã£ããªã¢ãã«-ã¢ãã«ã¯ãå€æŽãçºçãããšããã¢ã€ãã¢ãéç¥ããŸãã
ãŠã£ãããã£ã¢ã¢ã¯ãã£ããªã¢ãã«ãäœæããããã®javaã®ãã«ããŒã¯ã©ã¹ãããã€ããããŸãã 以äžã«äŸã瀺ããŸãã
java.beans
ããã±ãŒãžã®PropertyChangeSupport
ããã³PropertyChangeListener
java.util
ããã±ãŒãžã®Observable
ããã³Observer
android.databinding
ããã®BaseObservable
ããã³Observable.OnPropertyChangedCallback
ç§ã¯å人çã«ç¬¬äžã®æ¹æ³ã奜ãã§ãã
android.databinding.Bindable
ã¢ãããŒã·ã§ã³ã®ãããã§ã芳枬ãã£ãŒã«ãã®å³å¯ãªåœåããµããŒãããŸãã ããããä»ã®æ¹æ³ãããããããã¯ãã¹ãŠé©åã§ãã
Groovyã«ã¯çŽ æŽããã泚é
groovy.beans.BindableããããŸãã ãªããžã§ã¯ãã®ããããã£ãç°¡åã«å®£èšããæ©èœãšãšãã«ãéåžžã«ç°¡æœãªã³ãŒããååŸãããŸãïŒããã¯
java.beans
PropertyChangeSupport
äŸåããŠã
java.beans
ïŒã
@groovy.beans.Bindable class TicketSubsystem { Ticket ticket } @groovy.beans.Bindable class Ticket { String number int positionInQueue String tellerNumber }
æåº
TicketActivity
ïŒãã¬ãŒã³ããŒã·ã§ã³ã«é¢é£ããã»ãšãã©ãã¹ãŠã®ãªããžã§ã¯ããšåæ§ïŒã¯ããŠãŒã¶ãŒã®æå¿ã§è¡šç€ºããã³é衚瀺ã«ãªããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ã
Activity
ã衚瀺ãããããŒã¿ãå€æŽããããšãã«
Activity
ã衚瀺ããããšãã«ã®ã¿ãããŒã¿ãæ£ãã衚瀺ããå¿
èŠããããŸãã
ãã®ããã
TicketActivity
次ãå¿
èŠã§ãã
ticket
ããŒã¿ãå€æŽãããšãã«UIãŠã£ãžã§ãããæŽæ°ãã- ãªã¹ããŒã衚瀺ãããããã±ããã«æ¥ç¶ããŸã
- ãªã¹ããŒã
TicketSubsytem
æ¥ç¶ããŸãïŒ ticket
ã衚瀺ããããšãã«ãã¥ãŒãæŽæ°ããŸãïŒ
1. UIãŠã£ãžã§ãããæŽæ°ããŸãã
ãã®èšäºã®äŸã§ã¯ããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã«java.beans
ã®PropertyChangeListener
ã䜿çšããŸã
詳现ã ãŸãããœãŒã¹ã³ãŒãã§ã¯ãèšäºã®äžéšã«ãããªã³ã¯ã§android.databinding
ã©ã€ãã©ãªã䜿çšããŸããã
æãç°¡æœãªã³ãŒããæäŸãããã®ãšããŠã PropertyChangeListener ticketListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { updateTicketView(); } }; void updateTicketView() { TextView queuePositionView = (TextView) findViewById(R.id.textQueuePosition); queuePositionView.setText(ticket != null ? "" + ticket.getQueuePosition() : ""); ... }
2.ãªã¹ããŒããã±ããã«æ¥ç¶ãã
PropertyChangeListener ticketSubsystemListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { setTicket(ticketSubsystem.getTicket()); } }; void setTicket(Ticket newTicket) { if(ticket != null) { ticket.removePropertyChangeListener(ticketListener); } ticket = newTicket; if(ticket != null) { ticket.addPropertyChangeListener(ticketListener); } updateTicketView(); }
ãã±ãããå€æŽãããšã
setTicket
ã¡ãœããã¯å€ããã±ããããã€ãã³ããµãã¹ã¯ãªãã·ã§ã³ãåé€ããæ°ãããã±ããããã€ãã³ãããµãã¹ã¯ã©ã€ãããŸãã
setTicket(null)
ãåŒã³åºããšã
TicketActivity
ticket
ã€ãã³ãã®ãµãã¹ã¯
TicketActivity
解é€ããŸãã
3.ãªã¹ããŒãTicketSubsystemã«æ¥ç¶ãã
void setTicketSubsystem(TicketSubsystem newTicketSubsystem) { if(ticketSubsystem != null) { ticketSubsystem.removePropertyChangeListener(ticketSubsystemListener); setTicket(null); } ticketSubsystem = newTicketSubsystem; if(ticketSubsystem != null) { ticketSubsystem.addPropertyChangeListener(ticketSubsystemListener); setTicket(ticketSubsystem.getTicket()); } } @Override protected void onPostCreate(@Nullable Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); setTicketSubsystem(globalTicketSubsystem); } @Override protected void onStop() { super.onStop(); setTicketSubsystem(null); }
ã³ãŒãã¯éåžžã«ç°¡åã§ãã ããããç¹å¥ãªããŒã«ã䜿çšããã«ãåãã¿ã€ãã®æäœãéåžžã«å€ãèšè¿°ããå¿
èŠããããŸãã ã¢ãã«éå±€å
ã®åèŠçŽ ã«ã€ããŠããã£ãŒã«ããäœæããåå¥ã®ãªã¹ããŒãäœæããå¿
èŠããããŸãã
éåææäœããã±ãããåãã
éåææäœã³ãŒããéåžžã«ç°¡åã§ãã äž»ãªã¢ã€ãã¢ã¯ãéåææäœã®å®äºæã«çµæã
ã«æžã蟌ãããšã§ãã ãããŠã
ã¯
ããã®éç¥ã«ãã£ãŠæŽæ°ãããŸãã
public class GetNewTicket extends AsyncTask<Void, Void, Void> { private int queuePosition; private String ticketNumber; @Override protected Void doInBackground(Void... params) { SystemClock.sleep(TimeUnit.SECONDS.toMillis(2)); Random random = new Random(); queuePosition = random.nextInt(100); ticketNumber = "A" + queuePosition;
ããã§ã
globalTicketSubsystem
ãªã³ã¯ïŒ
globalTicketSubsystem
ãèšèŒãããŠã
TicketActivity
ïŒã¯ãã¢ããªã±ãŒã·ã§ã³ã§ãµãã·ã¹ãã ã
TicketActivity
æ¹æ³ã«ãã£ãŠç°ãªããŸãã
åèµ·åæã«ç¶æ
ã埩å
ãã
ãŠãŒã¶ãŒããTake a Ticketããã¿ã³ãã¯ãªãã¯ããã¢ããªã±ãŒã·ã§ã³ããµãŒããŒã«ãªã¯ãšã¹ããéä¿¡ãããã®æç¹ã§çä¿¡ã³ãŒã«ãçºçãããšããŸãã ãŠãŒã¶ãŒãåŒã³åºãã«å¿çããŠããéã«ããµãŒããŒããå¿çããããŸãããããŠãŒã¶ãŒã¯ããã«ã€ããŠç¥ããŸããã ããã«ããŠãŒã¶ãŒã¯ãããŒã ããã¯ãªãã¯ããŠããã¹ãŠã®ã¡ã¢ãªãé£ãå°œããã¢ããªã±ãŒã·ã§ã³ãèµ·åããã·ã¹ãã ã¯ã¢ããªã±ãŒã·ã§ã³ãã¢ã³ããŒãããå¿
èŠããããŸããã
ããã§ãã¢ããªã±ãŒã·ã§ã³ã¯åèµ·ååã«åãåã£ããã±ããã衚瀺ããã¯ãã§ãã
ãã®æ©èœãæäŸããã«ã¯ããã±ããããã¡ã€ã«ã«æžã蟌ã¿ãã¢ããªã±ãŒã·ã§ã³ã®èµ·ååŸã«èªã¿åããŸãã
public class ReadTicketFromFileextends AsyncTask<File, Void, Void> { ... @Override protected Void doInBackground(File... files) {
ã¬ã€ã€ãŒ
ãã®ãã³ãã¬ãŒãã¯ã1ã€ã®ã¯ã©ã¹ãä»ã®ã¯ã©ã¹ã«äŸåããããšãèš±å¯ããã«ãŒã«ãå®çŸ©ããŠãããããã³ãŒãã®ãã€ããéå°ã«ãªããŸããã äžè¬ã«ãããã¯ãã³ãã¬ãŒãã®ãã¡ããªã§ããããUMLãšãã¶ã€ã³ãã¿ãŒã³ã®ã¢ããªã±ãŒã·ã§ã³ããšããæ¬ã®Craig Larmanã®ããŒãžã§ã³ã«çŠç¹ãåœãŠãŠããŸãã
ããã«å³ããããŸã ã
åºæ¬çãªèãæ¹ã¯ãäžäœã¬ãã«ã®ã¯ã©ã¹ã¯äžäœã¬ãã«ã®ã¯ã©ã¹ã«äŸåã§ããªããšããããšã§ãã ã¯ã©ã¹ã
Layers
ã®ã¬ãã«ã«é
眮ãããšã次ã®å³ã®ããã«ãªããŸãã

ã¬ãã«ã®å¢çã暪åããã¹ãŠã®ç¢å°ã¯å³å¯ã«äžã«åããããŠããããšã«æ³šæããŠãã ããïŒ
TicketActivity
ã¯ã
GetNewTicket
äžç¢å°ãäœæããŸãã
GetNewTicket
ã¯ãäžç¢å°ã®
Ticket
äœæããŸãã å¿å
ticketListener
ã¯ã
PropertyChangeListener
ã€ã³ã¿ãŒãã§ãŒã¹ïŒäžç¢å°ïŒãå®è£
ããŸãã
Ticket
ãªã¹ããŒã«
PropertyChangeListener
äžç¢å°ãéç¥ããŸãã ç
ã€ãŸããäŸåé¢ä¿ïŒç¶æ¿ãã¯ã©ã¹ã®ã¡ã³ããŒã®åãšããŠã®äœ¿çšããã©ã¡ãŒã¿ãŒåãŸãã¯æ»ãå€ã®åãšããŠã®äœ¿çšãåãšããŠã®ããŒã«ã«å€æ°ã®äœ¿çšïŒã¯ãåãã¬ãã«ãŸãã¯ããããäœãã¬ãã«ã®ã¯ã©ã¹ã«ã®ã¿èš±å¯ãããŸãã
çè«ã®å¥ã®ãããããããã³ã³ãŒãã«ç§»åããŸãã
ã¬ãã«å²ãåœãŠ
Domains
ã¬ãã«ã®ãªããžã§ã¯ãã¯ãã¢ããªã±ãŒã·ã§ã³ãåäœããããžãã¹ãšã³ãã£ãã£ãåæ ããŸãã ãããã¯ãã¢ããªã±ãŒã·ã§ã³ã®é
眮æ¹æ³ãšã¯ç¡é¢ä¿ã§ãªããã°ãªããŸããã ããšãã°ã
Ticket
positionInQueue
ãã£ãŒã«ããååšããã®ã¯ãããžãã¹èŠä»¶ã«ãããã®ã§ãïŒã¢ããªã±ãŒã·ã§ã³ã®äœææ¹æ³ã§ã¯ãããŸããïŒã
Application
ã¬ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ããžãã¯ãé
眮ã§ããå Žæã®å¢çã§ãïŒå€èŠ³ã®æŽåœ¢ãé€ãïŒã æçšãªäœæ¥ãè¡ãå¿
èŠãããå Žåãã³ãŒãã¯ããïŒãŸãã¯ä»¥äžïŒã«ããã¯ãã§ãã
å€èŠ³ã䜿çšããŠäœããè¡ãå¿
èŠãããå Žåãããã¯
Presentation
ã¬ãã«ã®ã¯ã©ã¹ã§ãã ãããã£ãŠããã®ã¯ã©ã¹ã«ã¯è¡šç€ºã³ãŒãã®ã¿ãå«ããããšãã§ããããžãã¯ã¯å«ããããšãã§ããŸããã ããžãã¯ã«ã€ããŠã¯ã
Application
ã¬ãã«ããã¯ã©ã¹ã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã
ç¹å®ã®ã¬ãã«ã®
Layers
ãžã®ã¯ã©ã¹ã®æå±ã¯æ¡ä»¶ä»ãã§ãã ã¯ã©ã¹ã¯ãèŠä»¶ãæºãããŠããéããç¹å®ã®ã¬ãã«ã«ãããŸãã ã€ãŸããç·šéã®çµæãšããŠãã¯ã©ã¹ã¯å¥ã®ã¬ãã«ã«ç§»åããããä»»æã®ã¬ãã«ã«é©ããªããªã£ããããå¯èœæ§ããããŸãã
ç¹å®ã®ã¯ã©ã¹ãã©ã®ã¬ãã«ã«ããã¹ãããå€æããæ¹æ³ã¯ïŒ æ§ãããªçºèŠçæ¹æ³ãå
±æããŸãããäžè¬çã«ã¯ãã¢ã¯ã»ã·ãã«ãªçè«ãå匷ããããšããå§ãããŸãã
ããããã§ãå§ããŠ
ãã ãã ã
çºèŠç
- ã¢ããªã±ãŒã·ã§ã³ããã¬ãŒã³ããŒã·ã§ã³ã¬ãã«ãåé€ãããšããã¹ãŠã®æ©èœãå®è¡ã§ããã¯ãã§ãïŒçµæã®ãã¢ãé€ãïŒã ãã¬ãŒã³ããŒã·ã§ã³ã¬ãã«ã®ãªãã¢ããªã±ãŒã·ã§ã³ã«ã¯ããã±ããããªã¯ãšã¹ãããããã®ã³ãŒãããã±ããèªäœãããã³ããã«ã¢ã¯ã»ã¹ããããã®ã³ãŒããå«ãŸããŠããŸãã
- ããã¯ã©ã¹ã®ãªããžã§ã¯ããäœãã衚瀺ãããããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã«å¿çããå Žåããã®å Žæã¯ãã¥ãŒã¬ãã«ã«ãããŸãã
- 競åããå Žåã¯ãã¯ã©ã¹ãããã€ãã«åå²ããŸãã
ã³ãŒã
ãªããžããª
https://github.com/SamSoldatenko/habr3ã«ã¯ã
android.databinding
ããã³
roboguice
ã䜿çšããŠæ§ç¯ããããããã§èª¬æããã¢ããªã±ãŒã·ã§ã³ãå«ãŸããŠããŸãã ã³ãŒããèŠãŠãããã§ç§ãã©ã®ãããªéžæãããã©ã®ãããªçç±ã§è¡ã£ãã®ããç°¡åã«èª¬æããŸãã
ç°¡åãªèª¬æcom.android.support:appcompat-v7
äŸåé¢ä¿ãè¿œå ãããã®ã¯ãåçšéçºããã®ã©ã€ãã©ãªã«äŸåããŠå€ãããŒãžã§ã³ã®AndroidããµããŒãããããã§ãã
@UiThread
ã¢ãããŒã·ã§ã³ã䜿çšããããã«ã @UiThread
ïŒ com.android.support:support-annotations
äŸåé¢ä¿ãè¿œå ãããŸããïŒä»ã«ãå€ãã®äŸ¿å©ãªã¢ãããŒã·ã§ã³ããããŸãïŒã
- äŸåé¢ä¿
org.roboguice:roboguice
äŸåé¢ä¿æ³šå
¥ã®ããã®ã©ã€ãã©ãªã Injectã¢ãããŒã·ã§ã³ã䜿çšããŠããŒãããã¢ããªã±ãŒã·ã§ã³ãäœæããããã«äœ¿çšãããŸãã ãŸãããã®ã©ã€ãã©ãªã䜿çšãããšããªãœãŒã¹ããŠã£ãžã§ãããªã³ã¯ãåã蟌ãããšãã§ããJSR-299ã®CDIã€ãã³ãã«äŒŒãã¡ãã»ãŒãžè»¢éã¡ã«ããºã ãå«ãŸããŸãã
@Inject
ã¢ãããŒã·ã§ã³ã䜿çšããTicketActivity
ã¯ã TicketSubsystem
ãžã®ãªã³ã¯ãTicketSubsystem
ãŸãã@InjectResource
éåæã¿ã¹ã¯ã¯ã @InjectResource
ã¢ãããŒã·ã§ã³ã䜿çšããŠããã±ãããããŒãããå¿
èŠããããªãœãŒã¹ãããã¡ã€ã«åãReadTicketFromFile
ãŸãã@Inject
ã䜿çšããReadTicketFromFile
ã¯ã ReadTicketFromFile
äœæã«äœ¿çšããProvider
ãååŸãProvider
ã- ãã®ä»
org.roboguice:roboblender
ã¯ãã³ã³ãã€ã«æã«org.roboguice:roboguice
ãã¹ãŠã®æ³šéã®ããŒã¿ããŒã¹ãäœæããå®è¡æã«äœ¿çšããŸãã
roboguice
ã©ã€ãã©ãªããã®èŠåãæå¶ããèšå®ãapp/lint.xml
ãè¿œå ããŸããã
app/build.gradle
ã®dataBinding
ãªãã·ã§ã³ã¯ã Expression Language
ïŒ EL
ïŒã«é¡äŒŒããã¬ã€ã¢ãŠããã¡ã€ã«ã®ç¹å¥ãªæ§æãæå¹ã«ãã Ticket
ãšTicketSubsystem
ãã¢ã¯ãã£ãã¢ãã«ã«ããããã«äœ¿çšãããandroid.databinding
ããã±ãŒãžãå«ã¿ãŸãã ãã®çµæããã¥ãŒã³ãŒãã¯å€§å¹
ã«ç°¡çŽ åãããã¬ã€ã¢ãŠããã¡ã€ã«ã®å®£èšã«çœ®ãæããããŸãã äŸïŒ
<TextView ... android:text="@{ts.ticket.number}" />
.idea
ãã©ã«ããŒ.idea
.gitignore
ã«å«ãŸããŠ.gitignore
ã Android Studio
ãŸãã¯IDEA
ä»»æã®ããŒãžã§ã³ã䜿çšã§ããŸãã ãããžã§ã¯ãã¯build.gradle
ãã¡ã€ã«ãä»ããŠå®å
šã«ã€ã³ããŒãããã³åæãããŸãã
gradlew
ã©ãããŒã®æ§æã¯å€æŽãããŸããïŒ gradlew
ã gradlew.bat
ãã¡ã€ã«ãããã³gradlew.bat
ãã©ã«ããŒïŒã ããã¯éåžžã«å¹æçã§äŸ¿å©ãªã¡ã«ããºã ã§ãã
app/build.gradle
ã§unitTests.returnDefaultValues = true
ãèšå®ããŸãã ããã¯ãåäœãã¹ãã§ã®ã©ã³ãã ãšã©ãŒã«å¯Ÿããä¿è·ãšåäœãã¹ãã®ç°¡æœãã®åŠ¥åç¹ã§ãã ããã§ã¯ããŠããããã¹ãã®ç°¡æœããåªå
ããŸããã
org.mockito:mockito-core
ã©ã€ãã©ãªã¯ãåäœãã¹ãã§ã¹ã¿ããäœæããããã«äœ¿çšãããŸãã ããã«ããã®ã©ã€ãã©ãªã䜿çšãããšã @Mock
ããã³@InjectMocks
ã䜿çšããŠããã¹ãäžã®ã·ã¹ãã ããèšè¿°ããããšãã§ããŸãã äŸåæ§æ³šå
¥ã䜿çšããå Žåãã³ã³ããŒãã³ãã¯äŸåæ§ã䜿çšãããåã«å®è£
ãããããšããæåŸ
ãããŸãã ãã¹ãã®åã«ããã¹ãŠã®äŸåé¢ä¿ãå®è£
ããå¿
èŠããããŸãã Mockito
ã¯ããã¹ããããã¯ã©ã¹ã§ã¹ã¿ããäœæããã³å®è£
ã§ããŸãã ããã«ãããç¹ã«åã蟌ã¿ãã£ãŒã«ãã®è¡šç€ºãå¶éãããŠããå Žåããã¹ãã³ãŒãã倧å¹
ã«ç°¡çŽ åãããŸãã GetNewTicketTestãåç
§ããŠãã ããã
Mockito
ãªãRobolectric
çç±
- Androidéçºè
ã¯ããã®æ¹æ³ã§ããŒã«ã«ãŠããããã¹ããäœæããããšããå§ãããŸãã
- ããã«ããããç·šéããµã€ã¯ã«ã®æéãã¹-ããã¹ãå®è¡ã-ãçµæãïŒTDDã«ãšã£ãŠéèŠïŒã«ãªããŸãã
- Robolectricã¯ãåäœãã¹ããããçµ±åãã¹ãã«é©ããŠããŸãã
org.powermock:powermock-module-junit
ã©ã€ãã©ãªorg.powermock:powermock-module-junit
ããã³org.powermock:powermock-api-mockito
äžéšã®ãã®ã¯ãã©ã°ã«çœ®ãæããããšãã§ããŸããã ããšãã°ãéçã¡ãœããã眮ãæããããåºæ¬ã¯ã©ã¹ã¡ãœããã®åŒã³åºããæå¶ããŸãã ãããã®ç®çã®ããã«ã PowerMock
ã¯ã¯ã©ã¹ããŒããŒã眮ãæãããã€ãã³ãŒããä¿®æ£ããŸãã TicketActivityTest
ã§ã¯ã PowerMock
ã¯RoboActionBarActivity.onCreate(Bundle)
ãžã®åŒã³åºããæå¶ããéçã¡ãœããDataBindingUtil.setContentView
ãžã®åŒã³åºãããã®æ»ãå€ãèšå®ããŸã
- å€ãã®ã¯ã©ã¹ãã£ãŒã«ãã«ããã±ãŒãžããŒã«ã«ã¹ã³ãŒããããã®ã¯ãªãã§ããïŒ
- ããã¯ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§ãããã©ã€ãã©ãªã§ã¯ãããŸããã ã€ãŸããã¯ã©ã¹ã䜿çšãããã¹ãŠã®ã³ãŒããå¶åŸ¡ããŸãã ãããã£ãŠããã£ãŒã«ããé衚瀺ã«ããå¿
èŠã¯ãããŸããã
- ãã¹ãããã®ãã£ãŒã«ãã®å¯èŠæ§ã«ãããåäœãã¹ãã®èšè¿°ã容æã«ãªããŸãã
- ãªããã¹ãŠã®ãã£ãŒã«ããå
¬éãããŠããªãã®ã§ããïŒ
ã¯ã©ã¹ã®ãããªãã¯ã¡ã³ããŒã¯ãååšããã¯ã©ã¹ããã³å°æ¥è¡šç€ºãããä»ã®ãã¹ãŠã®ã¯ã©ã¹ã«å¯ŸããŠãã¯ã©ã¹ã«ãã£ãŠè¡ãããã³ãããã¡ã³ãã§ãã ãŸããããŒã«ã«ããã±ãŒãžã¯ãåãããã±ãŒãžã«åæã«å
¥ã£ãŠãã人ã®ã¿ã察象ãšããŠããŸãã ãããã£ãŠãããã±ãŒãžå
ã®ãã¹ãŠã®ã¯ã©ã¹ãæŽæ°ããå Žåãããã±ãŒãžããŒã«ã«ãã£ãŒã«ããå€æŽïŒååã®å€æŽãåé€ãæ°ãããã£ãŒã«ãã®è¿œå ïŒã§ããŸãã
LogInterface log
å€æ°ãéçã§ã¯ãªãã®ã¯ãªãã§ããïŒ
- åæåã³ãŒããèªåã§èšè¿°ããå¿
èŠã¯ãããŸããã DIã¯ãããæ¹åããŸãã
- ãã¬ãŒãã¹ã¿ãã«çœ®ãæããããããããã ç¹å®ã®å Žåã®ãã°åºåã¯ãæå®ãããããã¹ãã§ãã§ãã¯ãããŸãã
- RoboGuiceã®é¡äŒŒã¯ã©ã¹ã®åå«ã§ãã
LogInterface
ãšLogImpl
ãå¿
èŠãªã®ã¯ãªãã§ããïŒ
@ImplementedByã¢ãããŒã·ã§ã³@ImplementedBy(LogImpl.class)
䜿çšããŠRoboguiceæ§æãèŠå®ããã«ã¯
Ticket
TicketSubsystem
ãšTicketSubsystem
ã®@UiThread
ã¢ãããŒã·ã§ã³ãå¿
èŠãªçç±
ãããã®ã¯ã©ã¹ã¯ã衚瀺ãæŽæ°ããããã«UIã³ã³ããŒãã³ãã§äœ¿çšãããonPropertyChanged
ã€ãã³ãã®ãœãŒã¹ã§ãã UIã¹ã¬ããã§åŒã³åºããè¡ãããããšãä¿èšŒããå¿
èŠããããŸãã
TicketSubsystem
ã³ã³ã¹ãã©ã¯ã¿ãŒã§äœãèµ·ãããŸããïŒ
ã¢ããªã±ãŒã·ã§ã³ãèµ·åããåŸããã¡ã€ã«ããããŒã¿ãããŒãããå¿
èŠããããŸãã Androidã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã¯Application.onCreateã€ãã³ãã§ãã ãããããã®äŸã§ã¯ããã®ãããªã¯ã©ã¹ã¯è¿œå ãããŠããŸããã ãããã£ãŠããã¡ã€ã«ãèªã¿åãå¿
èŠãããç¬éã¯ã TicketSubsystem
ãäœæãããæéã«ãã£ãŠæ±ºãŸããŸãïŒ @Singleton
ã¢ãããŒã·ã§ã³ã§ããŒã¯ãããŠããTicketSubsystem
ã1ã€ã®ã³ããŒã®ã¿ãäœæãããŸãïŒã ãã ãã TicketSubsystem
ã³ã³ã¹ãã©ã¯ã¿ãŒã§ReadTicketFromFile
ãäœæããããšã¯ã§ããŸããããŸã äœæãããŠããªãReadTicketFromFile
ãžã®åç
§ãå¿
èŠãªããã§ãã ãããã£ãŠã ReadTicketFromFile
ã®äœæã¯ãã¹ããªãŒã ã®æ¬¡ã®UIã«ãŒããŸã§å»¶æãããŸãã
- åèµ·ååŸã®ã¢ããªã±ãŒã·ã§ã³ã®åäœã確èªããã«ã¯ïŒ
- [ãã±ãããååŸ]ãã¯ãªãã¯ããŸã
- 衚瀺ãããã®ãåŸ
ããã«ããããŒã ããã¯ãªãã¯ããŸã
- ã³ã³ãœãŒã«ã§ã
adb shell am kill ru.soldatenko.habr3
å®è¡ãadb shell am kill ru.soldatenko.habr3
- ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãã
ããããšã