
ç§ã®ååã¯Arkadyã§ããç§ã¯Badooã®Androidéçºè
ã§ãã æè¿ã®ããã°ã«ã¯ãGoãPHPãJSãQAã«é¢ããå€ãã®æçš¿ããããã¢ãã€ã«éçºã«é¢ãããããã¯ã§ããããèããããšã«ããŸããã RxJava 1ããRxJava 2ã«1ã€ã®Androidãããžã§ã¯ãã移æ€ããã€ã³ã¿ãŒãããã§ãã®ãããã¯ã«èšèŒãããŠãããã¹ãŠã®ãã®ãèªã¿ãŸããã ç¹ã«ãGOTOã³ãã³ããŒã²ã³2016ã«ã³ãã¡ã¬ã³ã¹ã®Jake Wortonã®ã¬ããŒãã§ããããã¯ç¿»èš³ã«ãµããããåè£ã§ããããã«æãããŸãããå€ãã®Androidéçºè
ãRxJava 2ãžã®åãæ¿ããèããŠãããšæããŸãã
Jakeã¯ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã«ã€ããŠããªãå€ãã®çŽ¹ä»ãè¡ã£ãããããã®èšäºãç解ããããã«RxJava 1ã®ç¥èã¯å¿
èŠãããŸããã ã¬ããŒãã¯ãRxJava2ããªãªãŒã¹ã®æºåãã§ãããšãã«æºåãããŸããïŒããŒãžã§ã³2.1.0ã¯ãã§ã«ãªãªãŒã¹ãããŠããŸãïŒã
åå¿ããçç±
ãªãå
šå¡ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã«ã€ããŠçªç¶è©±ãå§ããã®ã§ããïŒ ã¢ããªã±ãŒã·ã§ã³ãå®å
šã«åæåã§ããªãå Žåãåäžã®éåæãªãœãŒã¹ããããšãåŸæ¥ã®åœä»€åããã°ã©ãã³ã°ã¹ã¿ã€ã«ãå®å
šã«å£ããŠããŸããŸãã ããã¹ãŠãæ©èœããªããªãããšããæå³ã§ã¯ãªãããè€éããå¢ãããšããæå³ã§ã®ããã¬ã€ã¯ãããã®çµæãåœä»€åããã°ã©ãã³ã°ã®ãã¹ãŠã®å©ç¹ã倱ããå§ããŸãã
ç§ããããæ·±å»ãªåé¡ãšèããçç±ã説æããããã«ãäŸãæããŸãã
ããã€ãã®ä¿®é£Ÿåã䜿çšããŠUserãªããžã§ã¯ããååŸã§ããåçŽãªã¯ã©ã¹ããå§ããŸãããã
interface UserManager { User getUser(); void setName(String name); void setAge(int age); } UserManager um = new UserManager(); System.out.println(um.getUser()); um.setName("Jane Doe"); System.out.println(um.getUser());
åæã®ã·ã³ã°ã«ã¹ã¬ããã®äžçã«äœãã§ããå Žåããã®ã³ãŒãã¯ãã€ã³ã¹ã¿ã³ã¹ã®äœæããŠãŒã¶ãŒåºåãäžéšã®ããããã£ã®å€æŽããŠãŒã¶ãŒåºåãªã©ããŸãã«æåŸ
ã©ããã®åäœãããŸãã
åé¡ã¯ãéåææ§ã«é Œãå§ãããšãã«çºçããŸãã ãµãŒããŒåŽã®ããããã£ã®å€æŽãåæ ããå¿
èŠããããšããŸãããã ãããè¡ãã«ã¯ãæåŸã®2ã€ã®ã¡ãœãããéåæã§ããå¿
èŠããããŸãã ãã®å Žåãã©ã®ããã«ã³ãŒããå€æŽããŸããïŒ
解決çã®1ã€ã¯ãäœãããªãããšã§ããéåæãµãŒããŒæŽæ°ã®åŒã³åºããæåãããšæ³å®ããŠãããŒã«ã«ã§å€æŽãå ããããšãã§ããŸãã ãããã¯å³åº§ã«åæ ãããŸãã ãåç¥ã®ããã«ãããã¯è¯ãèãã§ã¯ãããŸããã ãããã¯ãŒã¯ã¯äºæž¬äžèœã§ããããµãŒããŒã¯ãšã©ãŒãè¿ãå¯èœæ§ããããããäœããã®çç±ã§ããŒã«ã«ç¶æ
ãããŒã«ããã¯ããå¿
èŠããããŸãã
ç°¡åãªè§£æ±ºçã¯ãéåæåŒã³åºããæ£åžžã«å®äºãããšãã«å®è¡ãããRunnable
ã䜿çšããããšã§ãã ããã¯äºåŸå¯Ÿå¿çãªåäœã§ããå€æŽèŠæ±ãæåããããšã確å®ãªå Žåã«ã®ã¿ã衚瀺ãããããŒã¿ãæŽæ°ããŸãã
interface UserManager { User getUser(); void setName(String name, Runnable callback); void setAge(int age, Runnable callback); } UserManager um = new UserManager(); System.out.println(um.getUser()); um.setName("Jane Doe", new Runnable() { @Override public void run() { System.out.println(um.getUser()); } });
ãã ããçºçããå¯èœæ§ã®ããåé¡ïŒãããã¯ãŒã¯ã®åé¡ãªã©ïŒã¯åŠçããŸããã ãšã©ãŒãçºçããå Žåã«äœãã§ããããã«ãç¹å¥ãªListener
äœæãã䟡å€ãããã®ã§ããããïŒ
UserManager um = new UserManager(); System.out.println(um.getUser()); um.setName("Jane Doe", new UserManager.Listener() { @Override public void success() { System.out.println(um.getUser()); } @Override public void failure(IOException e) {
åé¡ã«ã€ããŠãŠãŒã¶ãŒã«éç¥ã§ããŸãã èªåçã«åè©Šè¡ã§ããŸãã åæ§ã®ãœãªã¥ãŒã·ã§ã³ãæ©èœãããã®æ¹åã§ã¯ãéåæã³ãŒããšåäžã¹ã¬ããïŒAndroidã®å Žåãããã¯UIã¹ã¬ããïŒã§å®è¡ãããã³ãŒããçµã¿åãããå¿
èŠããããŸãã
éåæåŒã³åºããè¡ãå¿
èŠãããã»ã©ãåé¡ãå€ããªããŸãã ããšãã°ããŠãŒã¶ãŒããã©ãŒã ã«å
¥åãããšãããã€ãã®ããããã£ãå€æŽãããŸãã ãŸãã¯ãããåŒã³åºããæ£åžžã«å®äºãããšå¥ã®éåæåŒã³åºããããªã¬ãŒãããå Žåã«ãäžé£ã®éåæåŒã³åºãããããæåãŸãã¯å€±æã䌎ãå ŽåããããŸãã
UserManager um = new UserManager(); System.out.println(um.getUser()); um. setName(âJane Doeâ, new UserManager.Listener() { @Override public void success() { System.out.println(um.getUser()); } @Override public void failure(IOException e) {
ããã¯ãã¹ãŠAndroidã®ã³ã³ããã¹ãã§è¡ãããããšãå¿ããªãã§ãã ããã ãããã£ãŠãä»ã®å€ãã®èŠå ãèæ
®ããå¿
èŠããããŸãã ããšãã°ã success
ã³ãŒã«ããã¯ã§æ
å ±ãUIã«çŽæ¥è»¢éããããšããããšãã§ããŸãããåé¡ã¯Androidã®Activity
ãäžæçã§ããããšã§ãã ãããã¯ãã€ã§ãç Žå£ã§ããŸãã ãŠãŒã¶ãŒãçä¿¡ã³ãŒã«ãåä¿¡ãããšããŸããã-ã¢ããªã±ãŒã·ã§ã³ã¯ã·ã¹ãã ã«ãã£ãŠæå°åãããŸãã ãŸãã¯ããŠãŒã¶ãŒã[ Home
ãŸãã¯[ Back
ã¯ãªãã¯ããå¯èœæ§ããããŸãã UIã®ç Žæ£åŸã«éåæåŒã³åºããè¿ãããå Žåãåé¡ãçºçããŸãã
public final class UserActivity extends Activity { private final UserManager um = new UserManager(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.user); TextView tv = (TextView) findViewById(R.id.user_name); tv.setText(um.getUser().toString()); um.setName("Jane Doe", new UserManager.Listener() { @Override public void success() { tv.setText(um.getUser().toString()); } @Override public void failure(IOException e) {
åé¡ã解決ããããã®å¿
é ã®ã¢ãããŒãããããŸãã UIã¡ãœãããåŒã³åºãåã«ã¹ããŒã¿ã¹ã確èªã§ããŸãã
public final class UserActivity extends Activity { private final UserManager um = new UserManager(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.user); TextView tv = (TextView) findViewById(R.id.user_name); tv.setText(um.getUser().toString()); um.setName(âJane Doeâ, new UserManager.Listener() { @Override public void success() { if (!isDestroyed()) { tv.setText(um.getUser().toString()); } } @Override public void failure(IOException e) {
ãã®äŸã§ã¯ãéåæåŒã³åºããå®äºãããŸã§Activity
ãžã®åç
§ãä¿æãããããçæçãªã¡ã¢ãªãªãŒã¯ãæ確ã«åŒãèµ·ããå¿ååãäœæããŸãã
åé¡ã¯ããããã®ã³ãŒã«ããã¯ãã©ã®ã¹ã¬ããã§åŒã³åºããããããããªããšããäºå®ã«ããããŸãã ããã¯ã°ã©ãŠã³ãã¹ã¬ããã§åŒã³åºãããå¯èœæ§ããããããã€ãã³ããå®è¡ã®ã¡ã€ã³ã¹ã¬ããïŒ main/UI thread
ïŒã«éä¿¡ããå¿
èŠããããŸãã
public final class UserActivity extends Activity { private final UserManager um = new UserManager(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.user); TextView tv = (TextView) findViewById(R.id.user_name); tv.setText(um.getUser().toString()); um.setName("Jane Doe", new UserManager.Listener() { @Override public void success() { runOnUiThread(new Runnable() { @Override public void run() { if (!isDestroyed()) { tv.setText(um.getUser().toString()); } } }); } @Override public void failure(IOException e) {
ã³ãŒãã«ãã£ãŠè§£æ±ºãããã¡ã€ã³ã¿ã¹ã¯ã«é¢é£ããªããã®ãããããããActivity
ãæ£ããã£ãŠããŸãã ãããŠãããã¯ãã¹ãŠéåæã§äœæ¥ãéå§ããéåæã®çµæãåŠçããããšã§ãã éåæèŠæ±åŒã³åºããå®è£
ããŸããã ãŠãŒã¶ãŒå
¥åããããã¯ããããã¿ã³ã¯ãªãã¯ãåŠçãããè€æ°ã®ãã£ãŒã«ãã§åäœããŸããã
ã³ãŒããåçŽãªã¿ã¹ã¯ã1ã€ã ã解決ãããããå®éã®ã¢ããªã±ãŒã·ã§ã³ã«å€ãå§ãããšããŠããããã«åé¡ãçºçãã Activity
ç¶æ
ãšãã§ãã¯ã®æã管çããå¿
èŠã«çŽé¢ããŸãã
ãªã¢ã¯ãã£ãæè
å®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã¹ãŠãéåæã«åäœããŸãã ãªã¯ãšã¹ããéä¿¡ããé·ãæéãçµãŠåçãåãåããããã¯ãŒã¯ããããŸãã ã¡ã€ã³ã®å®è¡ã¹ã¬ããããããã¯ããããšã¯ã§ããªãããããããã¯ãŒã¯ã®æäœã¯ããã¯ã°ã©ãŠã³ãã¹ã¬ããã§å®è¡ããå¿
èŠããããŸãã ãã¡ã€ã«ã·ã¹ãã ãããŒã¿ããŒã¹ããªããžããªãžã®æžã蟌ã¿ãããã«ã¯shared preferences
ãžã®æžã蟌ã¿æã«ã¡ã€ã³ã¹ã¬ããããããã¯ããããšã¯ã§ããªãããããããã®æäœãããã¯ã°ã©ãŠã³ãã¹ããªãŒã ã§å®è¡ããå¿
èŠããããŸãã
ãŠãŒã¶ãŒãéåæããŒã¿ãœãŒã¹ã®ãããªãã®ã§ãã UIãä»ããŠæ
å ±ãæäŸãããã¿ã³ãæŒããŠãã£ãŒã«ãã«ããŒã¿ãå
¥åããããšã§ãããã«å¿çããŸãã

ãŠãŒã¶ãŒã¯ãç°ãªãæéã«ã¢ããªã±ãŒã·ã§ã³ã«æ»ãããšãã§ããŸãã ãŸããã¢ããªã±ãŒã·ã§ã³ã¯ããŒã¿ãåä¿¡ããæºåãã§ããŠããå¿
èŠããããå®è¡ã®ã¡ã€ã³ã¹ã¬ããããããã¯ãããŠããç¶æ
ããªãããã«ãªã¢ã¯ãã£ãã«ããå¿
èŠããããŸãã ãã®ãããããŒã¿ã®äžéšãéåæçã«å°çããç¶æ³ã¯ãããŸããããã¢ããªã±ãŒã·ã§ã³ã¯ãããäºæããããã®çµæãåä¿¡ããããŒã¿ãèæ
®ãããã¯ã©ãã·ã¥ããããŸããã ãããå°é£ã§ãã Activity
/ Fragment
ã§ãããã®ç¶æ
ããã¹ãŠç¶æããå¿
èŠããããŸãã å€æ°ã®éåæãœãŒã¹ããããããç°ãªãé床ã§ããŒã¿ãçæããã³æ¶è²»ãããšããäºå®ãšèª¿åãããå¿
èŠããããŸãã ãŸããéåæãã©ãããã©ãŒã ã§ããAndroidèªäœã®äœæ¥ã«ã€ããŠã¯èæ
®ããŠããŸããã ããã·ã¥éç¥ããããŒããã£ã¹ããæ§æã®å€æŽããããŸãã ãŠãŒã¶ãŒã¯ãã€ã§ãããã€ã¹ãããŒãã¬ãŒãããã©ã³ãã¹ã±ãŒãã«ããŸãã¯ãã®éã«åãæ¿ããããšãã§ããŸããã³ãŒãã®æºåãæŽã£ãŠããªãå Žåãã¢ããªã±ãŒã·ã§ã³ã¯ã¯ã©ãã·ã¥ããããæ£ããåäœããŸããã
ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£å
šäœã®åæãä¿èšŒããããšã¯ã§ããŸããããåäžã®éåæãªãœãŒã¹ããããšãåŸæ¥ã®åœä»€åããã°ã©ãã³ã°ã¹ã¿ã€ã«ã厩ããŸãã
ãããã¯ãŒã¯èŠæ±ã䜿çšããªãã¢ããªã±ãŒã·ã§ã³ãèŠã€ããããšã¯é£ããããããã¯æ¬è³ªçã«éåæã§ãã ãã£ã¹ã¯ããããããŒã¿ããŒã¹ã¯éåæãœãŒã¹ã§ãã UIã¯ãéåæãœãŒã¹ãšããŠã®ã¿èæ
®ãããã¹ãã§ãã ãã®ãããããã©ã«ãã§ã¯ãAndroidã®ãã¹ãŠãéåæã«æ©èœããŸãã åŸæ¥ã®åœä»€åããã°ã©ãã³ã°ãšç¶æ
管çã®ææ³ã«åºå·ãããšãèªåèªèº«ã«å®³ãåãŒããŸãã

ãã¹ãŠã®éåæã¢ãŒããã¯ãã£èŠçŽ ã調æŽããããšãã代ããã«ãããããçŽæ¥æ¥ç¶ããããšã«ããããã®è²¬ä»»ãã解æŸãããŸãã UIãããŒã¿ããŒã¹ã«çŽæ¥çœ²åããŠãããŒã¿ã®å€æŽã«å¿çã§ããããã«ããããšãã§ããŸãã ããŒã¿ããŒã¹åŒã³åºããšãããã¯ãŒã¯åŒã³åºããå€æŽããŠãã¯ãªãã¯ãååŸããŠéä¿¡ããã®ã§ã¯ãªãããã¿ã³ã®ã¯ãªãã¯ã«å¿çããããã«ããããšãã§ããŸãã
ç§ãã¡ãåãåã£ããããã¯ãŒã¯å¿çãããŒã¿ãæŽæ°ãããªãã°ãããã¯çŽ æŽãããã§ãããã çµå±ãããŒã¿ãæŽæ°ããããšãUIã¯èªåçã«æŽæ°ãããŸãã ãããã£ãŠãç§ãã¡ã¯ããã«ã€ããŠè²¬ä»»ãè² ããŸããã Androidãéåæã§äœããè¡ãå ŽåïŒããšãã°ãç»é¢ã®åãæ¿ãããããŒããã£ã¹ãïŒãã€ã³ã¿ãŒãã§ã€ã¹ã«èªåçã«åæ ãããããããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãèªåçã«éå§ããã®ã¯çŽ æŽãããããšã§ãã

äžè¬ã«ããã®ã¢ãããŒãã«ãããç¶æ
ããµããŒãããããã«å¿
èŠãªå€§éã®ã³ãŒããèšè¿°ã§ããªããªããŸããç¶æ
ã管çãã代ããã«ãã³ã³ããŒãã³ããäºãã«æ¥ç¶ããã ãã§ãã
Rxjava
RxJavaã«æž¡ããŸãã ãã®ãªã¢ã¯ãã£ãã©ã€ãã©ãªã¯ãJavaéçºã®æåã®ãã«æ©èœã®[ãªã¢ã¯ãã£ã]ããŒã«ã§ãã£ããããAndroidéçºã§æã人æ°ããããŸããã RxJava 2ã¯ãAndroidã®éçºã«éèŠãªå€ãããŒãžã§ã³ã®Javaã®ãµããŒããä¿æããŠããŸãã
RxJavaã¯ä»¥äžãæäŸããŸãã
- ããŒã¿ãœãŒã¹ãè¡šãããã®ã¯ã©ã¹ã®ã»ããã
- ããŒã¿ãœãŒã¹ããªãã¹ã³ããããã®ã¯ã©ã¹ã®ã»ããã
- ããŒã¿ãå€æããã³çµåããããã®äžé£ã®ã¡ãœããïŒæŒç®åïŒã
ãœãŒã¹
ããŒã¿ãœãŒã¹ã¯ããªãã¹ã³ãéå§ãŸãã¯çµäºãããšãã«äœããã®äœæ¥ãè¡ããŸãã å¿çã®åŸ
æ©ãéå§ãããŸã§éä¿¡ãããªããããã¯ãŒã¯èŠæ±ãéä¿¡ããŸãã ãŸããå®äºåã«ããŒã¿ãœãŒã¹ã®ãµãã¹ã¯ãªãã·ã§ã³ã解é€ãããšãçè«çã«ã¯ãããã¯ãŒã¯èŠæ±ããã£ã³ã»ã«ã§ããŸãã
ãœãŒã¹ã¯ãåæããã³éåæã®äž¡æ¹ã§åäœã§ããŸãã ããšãã°ãããã¯ã°ã©ãŠã³ãã¹ã¬ããã§å®è¡ãããŠããããããã³ã°ãããã¯ãŒã¯ãªã¯ãšã¹ãããŸãã¯AndroidãåŒã³åºããŠonActivityResultãåŸ
æ©ãããããªçŽç²ã«éåæãªãã®ã§ãã ãœãŒã¹ã¯ãåäžã®ã¢ã€ãã ãŸãã¯è€æ°ã®ã¢ã€ãã ãçæã§ããŸãã ãããã¯ãŒã¯èŠæ±ã¯åäžã®å¿çãè¿ããŸãã ãã ããUIãæ©èœããŠããéã¯ã1ã€ã®ãã¿ã³ã«ãµãã¹ã¯ã©ã€ãããŠããŠãããã¿ã³ã¯ãªãã¯ã®ãããŒã¯ç¡éã«ç¶ãå¯èœæ§ããããŸãã
ä»ã®ãœãŒã¹ã空ã«ãªãå ŽåããããŸãã ããã¯ãèŠçŽ ãå«ãŸããäœæ¥ãæåãŸãã¯å€±æããããŒã¿ãœãŒã¹ã®æŠå¿µã§ãã æ確ã«ããããã«ãããŒã¿ããŒã¹ãŸãã¯ãã¡ã€ã«ã«ããŒã¿ãæžã蟌ãã§ãããšæ³åããŠãã ããã 圌ãã¯ããªãã«ã¢ã€ãã ãè¿ããŸããã èšé²ã¯æåãããã©ããã®ããããã§ãã RxJavaã§ã¯ããœãŒã¹ã¯ããããã端æ«ã€ãã³ãonComplete()/ onError()
ã䜿çšããŠããã®ãå®è¡ãŸãã¯å€±æãã¢ãããŒããã¢ãã«åããŸãã ããã¯ãå¿çãè¿ãããäŸå€ãã¹ããŒããã¡ãœããã«äŒŒãŠããŸãã
å®äºããŠããªãå¯èœæ§ããããŸãã ããšãã°ãUIãæ©èœããŠããéãæ©èœããããŒã¿ãœãŒã¹ãšããŠããã¿ã³ã®æŒäžãã·ãã¥ã¬ãŒãããŸãã ãããŠãUIãæ¶ãããšããããããã¿ã³ã¯ãªãã¯ã®ãã®ãœãŒã¹ãããµãã¹ã¯ã©ã€ãã解é€ããŸããããã®äœæ¥ã¯å®äºããŸããã
ããã¯ãã¹ãŠã Observer
ãã¿ãŒã³ã«å¯Ÿå¿ããŠããŸãã ããŒã¿ãçæã§ãããã®ããããŸãã ãã®ããŒã¿ã®è¡šç€ºæ¹æ³ã«ã€ããŠã¯åæããããŸãã ãããŠãç§ãã¡ã¯ããããèŠããã§ãã ãªã¹ããŒãè¿œå ããäœããçºçãããšãã«éç¥ãåãåããŸãã
æµåæ§vs. 芳枬å¯èœ
RxJava 2ã§ã¯ããœãŒã¹ã¯2ã€ã®äž»èŠãªã¿ã€ã-FlowableãšObservableã§è¡šãããŸãã ãããã¯éåžžã«äŒŒãŠããŸãã ã©ã¡ãããŒãããnåã®èŠçŽ ãçæããŸãã äž¡æ¹ãšãæåãŸãã¯å€±æããå ŽåããããŸãã ã§ã¯ããªãåãããŒã¿æ§é ãè¡šãããã«2ã€ã®ç°ãªãã¿ã€ããå¿
èŠãªã®ã§ããããïŒ
ããã¯ãã¹ãŠèå§ã®ãããªãã®ã«ãªããŸãã 詳现ã«å
¥ãããšãªããããã¯ãã¬ãã·ã£ãŒãããŒã¿ãœãŒã¹ã®é床ãäœäžãããå¯èœæ§ããããšããèšããŸããã æ¢åã®ã·ã¹ãã ã®ãªãœãŒã¹ã¯éãããŠããŸãã ãããŠãããã¯ãã¬ãã·ã£ãŒã®å©ããåããŠãããŒã¿ãéä¿¡ãããã¹ãŠã®äººã«ãããŒã¿ãé
ããªãããã«äŒããããšãã§ããŸãã
RxJava 1ã¯ããã¯ãã¬ãã·ã£ãŒããµããŒãããŠããŸããããAPIã®éçºäžã«ããªãé
ããŠè¿œå ãããŸããã RxJava 1ã§ã¯ãã·ã¹ãã ã®åã¿ã€ãã«ããã¯ãã¬ãã·ã£ãŒã¡ã«ããºã ããããŸãã ããã¯ãã¬ãã·ã£ãŒã®æŠå¿µã¯ãã¹ãŠã®ã¿ã€ãã§ãµããŒããããŠããŸããããã¹ãŠã®ãœãŒã¹ããããå®è£
ããŠããããã§ã¯ãªãããããã®ã¡ã«ããºã ã䜿çšãããšã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããå¯èœæ§ããããŸãã èå§ã¢ããªã±ãŒã·ã§ã³ã¯ãäºåã«èšèšããã³æ€èšããå¿
èŠããããŸãã ããããRxJava 2ã«2çš®é¡ã®ãœãŒã¹ãããçç±ã§ãã ãã®ãããããã¯ãã¬ãã·ã£ãŒããµããŒããããã©ããããœãŒã¹ã¿ã€ãã§æå®ã§ããŸãã
ç»é¢ã¿ããã€ãã³ããšããããŒã¿ãœãŒã¹ããããšããŸãã é
ãããããšã¯ã§ããŸããã ãŠãŒã¶ãŒã«ããã£ã©ã¯ã¿ãŒã®ååãæããåŠçäžã«åæ¢ããŠåŸ
æ©ããæ®ããçµäºããŸãããšäŒããããšã¯ã§ããŸããã ãã¿ã³ããªãã«ãããå¥ã®UIã衚瀺ãããªã©ãå¥ã®æ¹æ³ã§ããŒã¿å
¥åãé
ãããããšã¯ã§ããŸããããœãŒã¹èªäœãé
ãããããšã¯ã§ããŸããã
å¥ã®äŸãèŠãŠã¿ãŸããããäžåºŠã«è€æ°ã®è¡ãæœåºããå¿
èŠãããè¡ã®å€§ããªã»ãããå«ãããŒã¿ããŒã¹ããããŸãã ããŒã¿ããŒã¹ã¯ã ã«ãŒãœã«ãªã©ã®ããŒã«ã®ãããã§ããã®åé¡ãéåžžã«å¹æçã«è§£æ±ºã§ããŸãã ãã ããã¿ããã€ãã³ãã®ãããŒã®å ŽåããŠãŒã¶ãŒã®æãé
ãããããšã¯ã§ããªãããããããå®è£
ããããšã¯ã§ããŸããã
RxJava 1ã§ã¯ãäžèšã®äž¡æ¹ã®ã¿ã€ããObservableãšããŠå®è£
ãããŠãããããå®è¡æã«ããã¯ãã¬ãã·ã£ãŒãé©çšããããšãããšã MissingBackpressureException
çºçããå ŽåããããŸãã ããããRxJava 2ã§ããŸããŸãªã¿ã€ãã§ãœãŒã¹ã衚瀺ãããçç±ã«ãªããŸããã1ã€ã¯ããã¯ãã¬ãã·ã£ãŒããµããŒããããã1ã€ã¯ãµããŒãããŸããã Observable
ãšFlowable
äž¡æ¹ã®ã¿ã€ãã¯ãããŒã¿ãã³ãŒã«ããã¯ã«è»¢éãããšããç¹ã§åæ§ã«åäœããŸãã ããã«ã¯2ã€ã®å¯Ÿå¿ããã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã
Observer
ïŒ
interface Observer<T> { void onNext(T t); void onComplete(); void onError(Throwable t); void onSubscribe(Disposable d); }
ãããŠSubscriber
ïŒ
interface Subscriber<T> { void onNext(T t); void onComplete(); void onError(Throwable t); void onSubscribe(Subscription s); }
æåã®ã¡ãœããã¯onNext
ãšåŒã°ããèŠçŽ ã¯ããã«é
ä¿¡ãããŸãã ãã®ã¡ãœããã¯ã Observable
ãŸãã¯Flowable
ãèŠçŽ ãçæãããã³ã«åŒã³åºãããä»»æã«åŠçã§ããããã«ããŸãã ããã¯ç¡éã«èµ·ããåŸãŸãã ãã¿ã³ã®ã¯ãªãã¯ãèããšãã¯ãªãã¯ããonNext
ã¡ãœãããåŒã³åºãããŸãã ç¡éã®ãœãŒã¹ã«ã¯ã2ã€ã®ç«¯æ«ã€ãã³ãããããŸãã
onComplete
æ£åžžçµäºãæå³ããŸããonError
-onNextã®å®è¡ãäŸå€ãã¹ããŒãããããœãŒã¹åŽã§åé¡ãçºçããããšãæå³ããŸãã
onComplete
ãšonError
ã¯ç«¯æ«ã€ãã³ãã§ããã€ãŸãããããããåä¿¡ããåŸããœãŒã¹ããã€ãã³ããåä¿¡ããããšã¯ãªããªããŸãã
Observer
ã€ã³ã¿ãŒãã§ãŒã¹ãšSubscriber
ã€ã³ã¿ãŒãã§ãŒã¹ã®éãã¯ãæåŸã®ã¡ãœããonSubscribe
ã§ãã ããã¯ãRxJava 1ãšæ¯èŒããæ°ããæ¹æ³ã§ããObservableãŸãã¯Flowableããµãã¹ã¯ã©ã€ãããå ŽåããªãœãŒã¹ãäœæããŸãããªãœãŒã¹ã®æäœãçµäºãããããªãœãŒã¹ãã¯ãªãŒã³ã¢ããããå¿
èŠããããŸãã onSubscribe
ã¯ãObservableãŸãã¯onSubscribe
ãªãã¹ã³ãéå§ãããšããã«åŒã³åºããã Disposable
ã®2ã€ã®ã¿ã€ãã®ãªããžã§ã¯ããæäŸããŸãã
interface Observer<T> { void onNext(T t); void onComplete(); void onError(Throwable t); void onSubscribe(Disposable d); } interface Disposable { void dispose(); }
ãŸãã¯Subscription
ïŒ
interface Subscriber<T> { void onNext(T t); void onComplete(); void onError(Throwable t); void onSubscribe(Subscription s); } interface Subscription { void cancel(); void request(long r); }
Observable
ã«é¢ããŠObservable
ã Disposable
ã¿ã€ãã䜿çšãããšãdisposeã¡ãœãããåŒã³åºãããšãã§ããŸããã€ãŸããããã®ãªãœãŒã¹ã§ã®äœæ¥ãçµäºããŸãããããŒã¿ã¯äžèŠã§ãããšããæå³ã§ãã ãããã¯ãŒã¯èŠæ±ãããå Žåã¯ããã£ã³ã»ã«ã§ããŸãã ãã¿ã³æŒäžã®ç¡éã®ã¹ããªãŒã ãèããå Žåãããã¯ãããã®ã€ãã³ããåä¿¡ããããªãããšãæå³ããŸãããã®å Žåã View
ããOnClickListener
ãåé€ã§ãView
ã
ããã¯ãã¹ãŠã Subscription
ã€ã³ã¿ãŒãã§ã€ã¹ã«ãåœãŠã¯ãŸããŸãã åŒã³åºãæ¹æ³ã¯ç°ãªããŸããããŸã£ããåãæ¹æ³ã§äœ¿çšãããŸãdispose()
䌌ãcancel()
ã¡ãœããããããŸãã ããã¯ã2çªç®ã®request(long r)
ã¡ãœãããååšããããšã§ã®ã¿ç°ãªããŸããããã«ãããAPIã«backpressure
ãçŸããŸãã ãã®ã¡ãœããã䜿çšããŠã Flowable
ããã«èŠçŽ ãå¿
èŠã§ããããšãäŒããŸãã
| èå§ãµããŒãä»ã | èå§ãµããŒããªã |
---|
0 â nèŠçŽ ã complete | error complete | error | æµåæ§ | 芳枬å¯èœ |
ãããã£ãŠãããã2ã€ã®ã¿ã€ãã®å¯äžã®éãã¯ãäžæ¹ãããã¯ãã¬ãã·ã£ãŒããµããŒãããããäžæ¹ããµããŒãããªãããšã§ãã
ãžã§ããã¹ããªãŒã
Disposable
ã¿ã€ããšSubscription
ã¿ã€ãã®ååãç°ãªãçç±ãšããã®ã¡ãœããdispose()
ãšcancel()
ã«ã€ããŠè§ŠããããšæããŸãã request()
ã¡ãœãããè¿œå ããããšã§ãäžæ¹ã ããæ¡åŒµã§ããªãã£ãã®ã¯ãªãã§ããïŒ ãžã§ããã¹ããªãŒã ã®ä»æ§ããã¹ãŠã§ãã ããã¯ãå€æ°ã®äŒæ¥ãçå
ããŠåãçµã¿ãJavaãªã¢ã¯ãã£ãã©ã€ãã©ãªçšã®æšæºã€ã³ã¿ãŒãã§ã€ã¹ã»ãããéçºããããšã決å®ããçµæã§ãã ä»æ§ã«ã¯4ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå«ãŸããŸãã
interface Publisher<T> { void subscribe(Subscriber<? super T> s); } interface Subscriber<T> { void onNext(T t); void onComplete(); void onError(Throwable t); void onSubscribe(Subscription s); } interface Subscription { void request(long n); void cancel(); } interface Processor<T, R> extends Subscriber<T>, Publisher<R> { }
äžèšã®ã³ãŒãã§ã¯ã Subscriber
ãšSubscription
çš®é¡ã衚瀺ãããŸãã ãããã¯ä»æ§ã®äžéšã§ããããããã£ãŠããããã®ååã¯RxJava 2ã§äœ¿çšãããŠããŸããããããã¯æšæºã®äžéšã§ãããããããã«å¯ŸããŠã§ããããšã¯äœããããŸããã ãããããã®ç¶æ³ã«ã¯è¯ãé¢ããããŸãã ã¹ããªãŒã ã«2ã€ã®ç°ãªãã©ã€ãã©ãªã䜿çšããå¿
èŠããããšããŸãããã äœæè
ãäžèšã®æšæºãå®è£
ããŠããå Žåãããããå®å
šã«åãæ¿ããããšãã§ããŸãã
| ãªã¢ã¯ãã£ãã¹ããªãŒã ïŒããã¯ãã¬ãã·ã£ãŒãµããŒãä»ãïŒ | èå§ãµããŒããªã |
---|
0 ... nèŠçŽ ã complete | error complete | error | æµåæ§ | 芳枬å¯èœ |
Flowableã¿ã€ãã¯ãèå§ã®ãµããŒããæå³ãããªã¢ã¯ãã£ããããŒã®ä»æ§ãå®è£
ããŸãã
UserManager
æ»ããŸãã 以åã¯ãã®ã¯ã©ã¹ãããŠãŒã¶ãŒãæœåºããé©åã ãšæã£ããšãã«è¡šç€ºããŠããŸããã ããã§ãObservableã䜿çšã§ããŸãã
interface UserManager { Observable<User> getUser(); void setName(String name); void setAge(int age); }
Observable<User>
ã¯ãUserãªããžã§ã¯ãã®ãœãŒã¹ã§ãã ãã¹ãŠã®å€æŽã§èŠçŽ ãçæããç»é¢ã«ããŒã¿ã衚瀺ããããšã§ããã«å¯Ÿå¿ã§ããŸãã ããã§ãã·ã¹ãã ã§çºçããä»ã®ã€ãã³ãã«åºã¥ããŠãããã«æé©ãªæéã決å®ããå¿
èŠããªããªããŸãã
ç¹åãããœãŒã¹
RxJava 2ã«ã¯ã Observable
ãµãã»ããã§ãã3ã€ã®ç¹æ®ãªãœãŒã¹ããããŸãã æåã®ãã®ã¯Single
ãšåŒã°ããŸãã åäžã®èŠçŽ ãå«ããããšã©ãŒãçæãããããããã¯åäžã®èŠçŽ ã®æœåšçã«éåæã®ãœãŒã¹ã»ã©èŠçŽ ã®ã·ãŒã±ã³ã¹ã§ã¯ãããŸããã ããã¯ãã¬ãã·ã£ãŒã¯ãµããŒãããŠããŸããã éåžžã®æ¹æ³ãšããŠæ³åã§ããŸãã ã¡ãœãããåŒã³åºããŠæ»ãå€ãååŸããŸãã ã¡ãœãããäŸå€ãã¹ããŒããŸãã Single
å®è£
ããã®ã¯ãã®ã¹ããŒã ã§ãã 賌èªãããšãã¢ã€ãã ãŸãã¯ãšã©ãŒã衚瀺ãããŸãã ãããåæã«ã Single
ã¯ãªã¢ã¯ãã£ãã§ãã
Completable
. void-. - , . , , , .
â Maybe
. RxJava 1. , , â Optional. backpressure.
RxJava 2 , Single/ Completable/ Maybe
, backpressure
( Reactive Streams Specification).
| ( backpressure) | backpressure |
---|
0âŠn , complete | error | Flowable | Observable |
item | complete | error | | Maybe |
item | error | | Single |
complete | error | | Completable |
interface UserManager { Observable<User> getUser(); void setName(String name); void setAge(int age); }
setName
setAge
, , , . Completable
.
interface UserManager { Observable<User> getUser(); Completable setName(String name); Completable setAge(int age); }
, , , . , .
Flowable.just("Hello"); Flowable.just("Hello", "World"); Observable.just("Hello"); Observable.just("Hello", "World"); Maybe.just("Hello"); Single.just("Hello");
Iterable
.
String[] array = { âHelloâ, âWorldâ }; List<String> list = Arrays.asList(array); Flowable.fromArray(array); Flowable.fromIterable(list); Observable.fromArray(array); Observable.fromIterable(list);
, , , , ( , ).
fromCallable
.
Observable.fromCallable(new Callable<String>() { @Override public String call() { return getName(); } });
, . fromCallable Java- Callable
, , . , HTTP- -.
OkHttpClient client =
Observable ( ) , , onError
. , onNext
.
fromCallable
:
Flowable.fromCallable(() -> "Hello"); Observable.fromCallable(() -> "Hello"); Maybe.fromCallable(() -> "Hello"); Single.fromCallable(() -> "Hello"); Completable.fromCallable(() -> "Ignored!");
. , .
Maybe
Completable
. , , â , .
Maybe.fromAction(()-> System.out.println(âHelloâ)); Maybe.fromRunnable(()-> System.out.println(âHelloâ)); Completable.fromAction(()-> System.out.println(âHelloâ)); Completable.fromRunnable(()-> System.out.println(âHelloâ));
, , Observable create
.
Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { e.onNext("Hello"); e.onComplete(); } });
RxJava 1, â , RxJava 1. RxJava 2, create â , . , subscribe, . ObservableEmitter
, . ObservableEmitter
. , .
.
Observable.create(e -> { e.onNext("Hello"); e.onComplete(); });
.
Observable.create(e -> { e.onNext("Hello"); e.onNext("World"); e.onComplete(); });
onNext
.
â . , HTTP-, onNext
HTTP-.
OkHttpClient client =
, Observable
reate
, , . - HTTP-, . HTTP- .
Observable.create(e -> { Call call = client.newCall(request); e.setCancelation(() -> call.cancel()); call.enqueue(new Callback() { @Override public void onResponse(Response r) throws IOException { e.onNext(r.body().string()); e.onComplete(); }A @Override public void onFailure(IOException e) { e.onError(e); } }); });
Android . , Observable
, , Listener
, .
View view =
create
:
Flowable.create(e -> { ⊠}); Observable.create(e -> { ⊠}); Maybe.create(e -> { ⊠}); Single.create(e -> { ⊠}); Completable.create(e -> { ⊠});
onSubscribe
Observer
/ Subscriber
.
Observer
:
interface Observer<T> { void onNext(T t); void onComplete(); void onError(Throwable t); void onSubscribe(Disposable d); } interface Disposable { void dispose(); }
Subscriber
:
interface Subscriber<T> { void onNext(T t); void onComplete(); void onError(Throwable t); void onSubscribe(Subscription s); } interface Subscription { void cancel(); void request(long r); }
, Observer/ Subscriber
, subscribe. - onSubscribe
â - Disposable
/ Subscription
.
Observable<String> o = Observable.just(âHelloâ); o.subscribe(new Observer<String>() { @Override public void onNext(Sring s) { ⊠} @Override public void onComplete() { ⊠} @Override public void onError(Throwable t) { ⊠} @Override public void onSubscribe(Disposable d) { ??? } });
DisposableObserver
, , Observable
.
Observable<String> o = Observable.just("Hello"); o.subscribe(new DisposableObserver<String>() { @Override public void onNext(String s) { ⊠} @Override public void onComplete() { ⊠} @Override public void onError(Throwable t) { ⊠} });
? .
â DisposableObserver
Observer
. Disposable
, dispose, .
Observable<String> o = Observable.just(âHelloâ); DisposableObserver observer = new DisposableObserver<String>() { @Override public void onNext(Sring s) { ⊠} @Override public void onComplete() { ⊠} @Override public void onError(Throwable t) { ⊠} } o.subscribe(observer); observer.dispose();
RxJava 2 subscribeWith
, subscribe
RxJava 1. Disposable
.
Observable<String> o = Observable.just(âHelloâ); Disposable d = new o.subscribeWith(new DisposableObserver<String>() { @Override public void onNext(String s) { ⊠} @Override public void onComplete() { ⊠} @Override public void onError(Throwable t) { ⊠} }); d.dispose();
RxJava Disposable
: , Disposable
, CompositeDisposable
.
Observable<String> o = Observable.just(âHelloâ); CompositeDisposable disposables = new CompositeDisposable(); disposables.add(o.subscribeWith(new DisposableObserver<String>() { @Override public void onNext(Sring s) { ⊠} @Override public void onComplete() { ⊠} @Override public void onError(Throwable t) { ⊠} })); disposables.dispose();
Android , CompositeDisposable
Activity
, onDestroy
( -).
subscribeWith
backpressure.
Observable<String> o = Observable.just(âHelloâ); Disposable d2 = o.subscribeWith(new DisposableObserver<String>() { ⊠}); Maybe<String> m = Maybe.just(âHelloâ); Disposable d3 = m.subscribeWith(new DisposableMaybeObserver<String>() { ⊠}); Single<String> s = String.just(âHelloâ); Disposable d4 = s.subscribeWith(new DisposableSingleObserver<String>() { ⊠}); Completable c = Completable.completed(); Disposable d5 = c.subscribeWith(new Disposable Completable Observer<String>() { ⊠});
Flowable
subscribeWith
, , Flowable
onSubscribe Subscription
, Disposable
.
Flowable<String> f = Flowable.just("Hello"); Disposable d1 = f.subscribeWith(new DisposableSubscriber<String>() { ⊠});
Disposable
, Flowable
.
, , . , - . , . Disposable
Observable, .
ãªãã¬ãŒã¿ãŒ
:
.
, , . , toUppercase()
.
String greeting = âHelloâ; String yelling = greeting.toUppercase();
Observable
.
Observable<String> greeting = Observable.just("Hello"); Observable<String> yelling = greeting.map(s -> s.toUppercase());
map
. - , .
User
: , , . , , .
Observable<User> user = um.getUser(); Observable<User> mainThreadUser = user.observeOn(AndroidSchedulers.mainThread());
: « Observable
». .
observeOn , Observable
.
OkHttpClient client =
. , , . , ( ), . , Schedulers.io()
â . , . subscribeOn
â , .
, Observable
. , . â . . . . . .
OkHttpClient client =
map observeOn
, Android. HTTP- â , .
OkHttpClient client =
RxJava , Observable
. , first()
, . RxJava 1 Observable
, . : , get(0)
, , , , â . RxJava 2 : first()
, , Single
.

Observable
, , Single
, .

firstElement()
, Maybe
. Observable
Maybe
.

, Completable
. , , ignoreElements
.

Flowable
: , .
.

«» . , , , «» Single
. «» . , Single
Observable
.
, User : « , UI ». User', , .
um.getUser() .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver<User>() { @Override public void onNext(User user) { tv.setText(user.toString()); } @Override public void onComplete() { } @Override public void onError(Throwable t) { } }));
, - Disposable. Android, Activity
. onDestroy
Disposables
.
, , , . â . .
disposables.add(um.setName("Jane Doe") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableCompletableObserver() { @Override public void onComplete() {
: . Disposable
. Disposable
.
RxJava 2 , Android: . , Observable
, . map, Observable
, , .
. RxJava 2 . , . , , â API.
ãããã«
RxJava 2 : â , Android, , UI â , , .
RxJava 1, , . RxJava 2.
class RxJavaInterop { static <T> Flowable<T> toV2Flowable(rx.Observable<T> o) { ⊠} static <T> Observable<T> toV2Observable(rx.Observable<T> o) { ⊠} static <T> Maybe<T> toV2Maybe(rx.Single<T> s) { ⊠} static <T> Maybe<T> toV2Maybe(rx.Completable c) { ⊠} static <T> Single<T> toV2Single(rx.Single<T> s) { ⊠} static Completable toV2Completable(rx.Completable c) { ⊠} static <T> rx.Observable<T> toV1Observable(Publisher<T> p) { ⊠} static <T> rx.Observable<T> toV1Observable(Observable<T> o, âŠ) { ⊠} static <T> rx.Single<T> toV1Single(Single<T> o) { ⊠} static <T> rx.Single<T> toV1Single(Maybe<T> m) { ⊠} static rx.Completable toV1Completable(Completable c) { ⊠} static rx.Completable toV1Completable(Maybe<T> m) { ⊠} }
â . , . , - .