Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¸ø Android ¿ª·¢ÕßµÄ RxJava Ïê½â
 
×÷ÕߣºÈÓÎïÏß ·¢²¼ÓÚ£º 2017-11-3
  2275  次浏览      27
 

ǰÑÔ

ÎÒ´ÓÈ¥Ä꿪ʼʹÓà RxJava £¬µ½ÏÖÔÚÒ»Äê¶àÁË¡£½ñÄê¼ÓÈëÁË Flipboard ºó£¬¿´µ½ Flipboard µÄ Android ÏîĿҲÔÚʹÓà RxJava £¬²¢ÇÒʹÓõij¡¾°Ô½À´Ô½¶à ¡£¶ø×î½üÕ⼸¸öÔ£¬ÎÒÒ²·¢ÏÖ¹úÄÚÔ½À´Ô½¶àµÄÈË¿ªÊ¼Ìá¼° RxJava ¡£ÓÐÈË˵¡ºRxJava ÕæÊÇÌ«ºÃÓÃÁË¡»£¬ÓÐÈË˵¡ºRxJava ÕæÊÇÌ«ÄÑÓÃÁË¡»£¬ÁíÍâ¸ü¶àµÄÈ˱íʾ£ºÎÒÕæµÄ°Ù¶ÈÁËÒ²¹È¸èÁË£¬µ«ÎÒ»¹ÊÇÏëÎÊ£º RxJava µ½µ×ÊÇʲô£¿

¼øÓÚ RxJava ĿǰÕâÖּȻð±¬ÓÖÉñÃØµÄÏÖ×´£¬¶øÎÒÓÖÔÚÒ»ÄêµÄʹÓùý³ÌÖÐ¶Ô RxJava ÓÐÁËһЩÀí½â£¬ÎÒ¾ö¶¨Ð´ÏÂÕâÆªÎÄÕÂÀ´¶Ô RxJava ×öÒ»¸öÏà¶ÔÏêϸµÄ¡¢Õë¶Ô Android ¿ª·¢ÕߵĽéÉÜ¡£

RxJava µ½µ×ÊÇʲô

Ò»¸ö´Ê£ºÒì²½¡£

RxJava ÔÚ GitHub Ö÷Ò³ÉϵÄ×ÔÎÒ½éÉÜÊÇ "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"£¨Ò»¸öÔÚ Java VM ÉÏʹÓÿɹ۲âµÄÐòÁÐÀ´×é³ÉÒì²½µÄ¡¢»ùÓÚʼþµÄ³ÌÐòµÄ¿â£©¡£Õâ¾ÍÊÇ RxJava £¬¸ÅÀ¨µÃ·Ç³£¾«×¼¡£

È»¶ø£¬¶ÔÓÚ³õѧÕßÀ´Ëµ£¬ÕâÌ«ÄÑ¿´¶®ÁË¡£ÒòΪËüÊÇÒ»¸ö¡º×ܽ᡻£¬¶ø³õѧÕ߸üÐèÒªÒ»¸ö¡ºÒýÑÔ¡»¡£

Æäʵ£¬ RxJava µÄ±¾ÖÊ¿ÉÒÔѹËõΪÒì²½ÕâÒ»¸ö´Ê¡£Ëµµ½¸ùÉÏ£¬Ëü¾ÍÊÇÒ»¸öʵÏÖÒì²½²Ù×÷µÄ¿â£¬¶ø±ðµÄ¶¨Óï¶¼ÊÇ»ùÓÚÕâÖ®Éϵġ£

RxJava ºÃÔÚÄÄ

»»¾ä»°Ëµ£¬¡ºÍ¬ÑùÊÇ×öÒì²½£¬ÎªÊ²Ã´ÈËÃÇÓÃËü£¬¶ø²»ÓÃÏÖ³ÉµÄ AsyncTask / Handler / XXX / ... £¿¡»

Ò»¸ö´Ê£º¼ò½à¡£

Òì²½²Ù×÷ºÜ¹Ø¼üµÄÒ»µãÊdzÌÐòµÄ¼ò½àÐÔ£¬ÒòΪÔÚµ÷¶È¹ý³Ì±È½Ï¸´ÔÓµÄÇé¿öÏ£¬Òì²½´úÂë¾­³£»á¼ÈÄÑдҲÄѱ»¶Á¶®¡£ Android ´´ÔìµÄ AsyncTask ºÍHandler £¬Æäʵ¶¼ÊÇΪÁËÈÃÒì²½´úÂë¸ü¼Ó¼ò½à¡£RxJava µÄÓÅÊÆÒ²ÊǼò½à£¬µ«ËüµÄ¼ò½àµÄÓëÖÚ²»Í¬Ö®´¦ÔÚÓÚ£¬Ëæ×ųÌÐòÂß¼­±äµÃÔ½À´Ô½¸´ÔÓ£¬ËüÒÀÈ»Äܹ»±£³Ö¼ò½à¡£

¾Ù¸öÀý×Ó

¼ÙÉèÓÐÕâÑùÒ»¸öÐèÇ󣺽çÃæÉÏÓÐÒ»¸ö×Ô¶¨ÒåµÄÊÓͼ imageCollectorView £¬ËüµÄ×÷ÓÃÊÇÏÔʾ¶àÕÅͼƬ£¬²¢ÄÜʹÓà addImage(Bitmap) ·½·¨À´ÈÎÒâÔö¼ÓÏÔʾµÄͼƬ¡£ÏÖÔÚÐèÒª³ÌÐò½«Ò»¸ö¸ø³öµÄĿ¼Êý×é File[] folders ÖÐÿ¸öĿ¼Ï嵀 png ͼƬ¶¼¼ÓÔØ³öÀ´²¢ÏÔʾÔÚ imageCollectorView ÖС£ÐèҪעÒâµÄÊÇ£¬ÓÉÓÚ¶ÁȡͼƬµÄÕâÒ»¹ý³Ì½ÏΪºÄʱ£¬ÐèÒª·ÅÔÚºǫִ́ÐУ¬¶øÍ¼Æ¬µÄÏÔʾÔò±ØÐëÔÚ UI Ïß³ÌÖ´ÐС£³£ÓõÄʵÏÖ·½Ê½ÓжàÖÖ£¬ÎÒÕâÀïÌù³öÆäÖÐÒ»ÖÖ£º

new Thread() {
@Override
public void run() {
super.run();
for (File folder : folders) {
File[] files = folder.listFiles();
for (File file : files) {
if (file.getName().endsWith(".png")) {
final Bitmap bitmap = getBitmapFromFile(file);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
imageCollectorView.addImage(bitmap);
}
});
}
}
}
}
}.start();

¶øÈç¹ûʹÓà RxJava £¬ÊµÏÖ·½Ê½ÊÇÕâÑùµÄ£º

Observable.from(folders)
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {
return Observable.from(file.listFiles());
}
})
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1<File, Bitmap>() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imageCollectorView.addImage(bitmap);
}
});

ÄÇλ˵»°ÁË£º¡ºÄãÕâ´úÂëÃ÷Ã÷±ä¶àÁ˰¡£¡¼ò½à¸öë°¡£¡¡»´óÐÖµÜÄãÏûÏûÆø£¬ÎÒ˵µÄÊÇÂß¼­µÄ¼ò½à£¬²»Êǵ¥´¿µÄ´úÂëÁ¿ÉÙ£¨Âß¼­¼ò½à²ÅÊÇÌáÉý¶Áд´úÂëËٶȵıØÉ±¼¼¶Ô²»£¿£©¡£¹Û²ìÒ»ÏÂÄã»á·¢ÏÖ£¬ RxJava µÄÕâ¸öʵÏÖ£¬ÊÇÒ»Ìõ´ÓÉϵ½ÏµÄÁ´Ê½µ÷Óã¬Ã»ÓÐÈκÎǶÌ×£¬ÕâÔÚÂß¼­µÄ¼ò½àÐÔÉÏÊǾßÓÐÓÅÊÆµÄ¡£µ±ÐèÇó±äµÃ¸´ÔÓʱ£¬ÕâÖÖÓÅÊÆ½«¸ü¼ÓÃ÷ÏÔ£¨ÊÔÏëÈç¹û»¹ÒªÇóֻѡȡǰ 10 ÕÅͼƬ£¬³£¹æ·½Ê½ÒªÔõô°ì£¿Èç¹ûÓиü¶àÕâÑùÄÇÑùµÄÒªÇóÄØ£¿ÔÙÊÔÏ룬ÔÚÕâÒ»´ó¶ÑÐèÇóʵÏÖÍêÁ½¸öÔÂÖ®ºóÐèÒª¸Ä¹¦ÄÜ£¬µ±Äã·­»ØÕâÀï¿´µ½×Ô¼ºµ±³õдϵÄÄÇһƬÃÔÖ®Ëõ½ø£¬ÄãÄܱ£Ö¤×Ô¼º½«Ñ¸ËÙ¿´¶®£¬¶ø²»ÊǶÔ×Å´úÂëÖØÐÂÞÛÒ»±é˼·£¿£©¡£

ÁíÍ⣬Èç¹ûÄãµÄ IDE ÊÇ Android Studio £¬Æäʵÿ´Î´ò¿ªÄ³¸ö Java ÎļþµÄʱºò£¬Äã»á¿´µ½±»×Ô¶¯ Lambda »¯µÄÔ¤ÀÀ£¬Õ⽫ÈÃÄã¸ü¼ÓÇåÎúµØ¿´µ½³ÌÐòÂß¼­£º

Observable.from(folders)
.flatMap((Func1) (folder) -> { Observable.from(file.listFiles()) })
.filter((Func1) (file) -> { file.getName().endsWith(".png") })
.map((Func1) (file) -> { getBitmapFromFile(file) })
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((Action1) (bitmap) -> { imageCollectorView.addImage(bitmap) });

Èç¹ûÄãϰ¹ßʹÓà Retrolambda £¬ÄãÒ²¿ÉÒÔÖ±½Ó°Ñ´úÂëд³ÉÉÏÃæÕâÖÖ¼ò½àµÄÐÎʽ¡£¶øÈç¹ûÄã¿´µ½ÕâÀﻹ²»ÖªµÀʲôÊÇ Retrolambda £¬ÎÒ²»½¨ÒéÄãÏÖÔÚ¾ÍȥѧϰËü¡£Ô­ÒòÓÐÁ½µã£º1. Lambda ÊǰÑË«Èн££¬ËüÈÃÄãµÄ´úÂë¼ò½àµÄͬʱ£¬½µµÍÁË´úÂëµÄ¿É¶ÁÐÔ£¬Òò´Ëͬʱѧϰ RxJava ºÍ Retrolambda ¿ÉÄÜ»áÈÃÄãºöÂÔ RxJava µÄһЩ¼¼Êõϸ½Ú£»2. Retrolambda ÊÇ Java 6/7 ¶Ô Lambda ±í´ïʽµÄ·Ç¹Ù·½¼æÈÝ·½°¸£¬ËüµÄÏòºó¼æÈÝÐÔºÍÎȶ¨ÐÔÊÇÎÞ·¨±£Õϵģ¬Òò´Ë¶ÔÓÚÆóÒµÏîÄ¿£¬Ê¹Óà Retrolambda ÊÇÓзçÏյġ£ËùÒÔ£¬ÓëºÜ¶à RxJava µÄÍÆ¹ãÕß²»Í¬£¬ÎÒ²¢²»ÍƼöÔÚѧϰ RxJava µÄͬʱһÆðѧϰ Retrolambda¡£ÊÂʵÉÏ£¬ÎÒ¸öÈËËäÈ»ºÜÐÀÉÍ Retrolambda£¬µ«ÎÒ´ÓÀ´²»ÓÃËü¡£

ÔÚFlipboard µÄ Android ´úÂëÖУ¬ÓÐÒ»¶ÎÂß¼­·Ç³£¸´ÔÓ£¬°üº¬Á˶à´ÎÄÚ´æ²Ù×÷¡¢±¾µØÎļþ²Ù×÷ºÍÍøÂç²Ù×÷£¬¶ÔÏó·Ö·ÖºÏºÏ£¬Ï̼߳äÏ໥ÅäºÏÏ໥µÈ´ý£¬Ò»»á¶ùÅųÉÈË×Ö£¬Ò»»á¶ùÅųÉÒ»×Ö¡£Èç¹ûʹÓ󣹿µÄ·½·¨À´ÊµÏÖ£¬¿Ï¶¨ÊÇҪдµÃÓûÏÉÓûËÀ£¬È»¶øÔÚʹÓà RxJava µÄÇé¿öÏ£¬ÒÀȻֻÊÇÒ»ÌõÁ´Ê½µ÷ÓþÍÍê³ÉÁË¡£ËüºÜ³¤£¬µ«ºÜÇåÎú¡£

ËùÒÔ£¬ RxJava ºÃÔÚÄÄ£¿¾ÍºÃÔÚ¼ò½à£¬ºÃÔÚÄǰÑʲô¸´ÔÓÂß¼­¶¼ÄÜ´©³ÉÒ»ÌõÏߵļò½à¡£

API ½éÉܺÍÔ­Àí¼òÎö

Õâ¸öÎÒ¾Í×ö²»µ½Ò»¸ö´Ê˵Ã÷ÁË¡­¡­ÒòΪÕâÒ»½ÚµÄÖ÷ÒªÄÚÈݾÍÊÇÒ»²½²½µØËµÃ÷ RxJava µ½µ×ÔõÑù×öµ½ÁËÒì²½£¬ÔõÑù×öµ½Á˼ò½à¡£

1. ¸ÅÄÀ©Õ¹µÄ¹Û²ìÕßģʽ

RxJava µÄÒ첽ʵÏÖ£¬ÊÇͨ¹ýÒ»ÖÖÀ©Õ¹µÄ¹Û²ìÕßģʽÀ´ÊµÏֵġ£

¹Û²ìÕßģʽ

ÏȼòÊöһϹ۲ìÕßģʽ£¬ÒѾ­ÊìϤµÄ¿ÉÒÔÌø¹ýÕâÒ»¶Î¡£

¹Û²ìÕßÄ£Ê½ÃæÏòµÄÐèÇóÊÇ£ºA ¶ÔÏ󣨹۲ìÕߣ©¶Ô B ¶ÔÏ󣨱»¹Û²ìÕߣ©µÄijÖֱ仯¸ß¶ÈÃô¸Ð£¬ÐèÒªÔÚ B ±ä»¯µÄһ˲¼ä×ö³ö·´Ó¦¡£¾Ù¸öÀý×Ó£¬ÐÂÎÅÀïϲÎÅÀÖ¼ûµÄ¾¯²ìץС͵£¬¾¯²ìÐèÒªÔÚС͵ÉìÊÖ×÷°¸µÄʱºòʵʩץ²¶¡£ÔÚÕâ¸öÀý×ÓÀ¾¯²ìÊǹ۲ìÕߣ¬Ð¡ÍµÊDZ»¹Û²ìÕߣ¬¾¯²ìÐèҪʱ¿Ì¶¢×ÅС͵µÄÒ»¾ÙÒ»¶¯£¬²ÅÄܱ£Ö¤²»»á©¹ýÈκÎ˲¼ä¡£³ÌÐòµÄ¹Û²ìÕßģʽºÍÕâÖÖÕæÕýµÄ¡º¹Û²ì¡»ÂÔÓв»Í¬£¬¹Û²ìÕß²»ÐèҪʱ¿Ì¶¢×ű»¹Û²ìÕߣ¨ÀýÈç A ²»ÐèҪÿ¹ý 2ms ¾Í¼ì²éÒ»´Î B µÄ״̬£©£¬¶øÊDzÉÓÃ×¢²á(Register)»òÕß³ÆÎª¶©ÔÄ(Subscribe)µÄ·½Ê½£¬¸æËß±»¹Û²ìÕߣºÎÒÐèÒªÄãµÄijij״̬£¬ÄãÒªÔÚËü±ä»¯µÄʱºò֪ͨÎÒ¡£ Android ¿ª·¢ÖÐÒ»¸ö±È½ÏµäÐ͵ÄÀý×ÓÊǵã»÷¼àÌýÆ÷ OnClickListener ¡£¶ÔÉèÖà OnClickListener À´Ëµ£¬ View ÊDZ»¹Û²ìÕߣ¬ OnClickListener Êǹ۲ìÕߣ¬¶þÕßͨ¹ý setOnClickListener() ·½·¨´ï³É¶©ÔĹØÏµ¡£¶©ÔÄÖ®ºóÓû§µã»÷°´Å¥µÄ˲¼ä£¬Android Framework ¾Í»á½«µã»÷ʼþ·¢Ë͸øÒѾ­×¢²áµÄ OnClickListener ¡£²ÉÈ¡ÕâÑù±»¶¯µÄ¹Û²ì·½Ê½£¬¼ÈʡȥÁË·´¸´¼ìË÷״̬µÄ×ÊÔ´ÏûºÄ£¬Ò²Äܹ»µÃµ½×î¸ßµÄ·´À¡ËÙ¶È¡£µ±È»£¬ÕâÒ²µÃÒæÓÚÎÒÃÇ¿ÉÒÔËæÒâ¶¨ÖÆ×Ô¼º³ÌÐòÖеĹ۲ìÕߺͱ»¹Û²ìÕߣ¬¶ø¾¯²ìÊåÊåÃ÷ÏÔÎÞ·¨ÒªÇóС͵¡ºÄãÔÚ×÷°¸µÄʱºòÎñ±ØÍ¨ÖªÎÒ¡»¡£

OnClickListener µÄģʽ´óÖÂÈçÏÂͼ£º

ÈçͼËùʾ£¬Í¨¹ý setOnClickListener() ·½·¨£¬Button ³ÖÓÐ OnClickListener µÄÒýÓã¨ÕâÒ»¹ý³ÌûÓÐÔÚͼÉÏ»­³ö£©£»µ±Óû§µã»÷ʱ£¬Button ×Ô¶¯µ÷Óà OnClickListener µÄ onClick() ·½·¨¡£ÁíÍ⣬Èç¹û°ÑÕâÕÅͼÖеĸÅÄî³éÏó³öÀ´£¨Button -> ±»¹Û²ìÕß¡¢OnClickListener -> ¹Û²ìÕß¡¢setOnClickListener() -> ¶©ÔÄ£¬onClick() -> ʼþ£©£¬¾ÍÓÉרÓõĹ۲ìÕßģʽ£¨ÀýÈçÖ»ÓÃÓÚ¼àÌý¿Ø¼þµã»÷£©×ª±ä³ÉÁËͨÓõĹ۲ìÕßģʽ¡£ÈçÏÂͼ£º

ͨÓù۲ìÕßģʽ

¶ø RxJava ×÷Ϊһ¸ö¹¤¾ß¿â£¬Ê¹ÓõľÍÊÇͨÓÃÐÎʽµÄ¹Û²ìÕßģʽ¡£

RxJava µÄ¹Û²ìÕßģʽ

RxJava ÓÐËĸö»ù±¾¸ÅÄObservable (¿É¹Û²ìÕߣ¬¼´±»¹Û²ìÕß)¡¢ Observer (¹Û²ìÕß)¡¢ subscribe (¶©ÔÄ)¡¢Ê¼þ¡£Observable ºÍ Observer ͨ¹ý subscribe() ·½·¨ÊµÏÖ¶©ÔĹØÏµ£¬´Ó¶ø Observable ¿ÉÒÔÔÚÐèÒªµÄʱºò·¢³öʼþÀ´Í¨Öª Observer¡£

Ó봫ͳ¹Û²ìÕßģʽ²»Í¬£¬ RxJava µÄʼþ»Øµ÷·½·¨³ýÁËÆÕͨʼþ onNext() £¨Ï൱ÓÚ onClick() / onEvent()£©Ö®Í⣬»¹¶¨ÒåÁËÁ½¸öÌØÊâµÄʼþ£ºonCompleted() ºÍ onError()¡£

onCompleted(): ʼþ¶ÓÁÐÍê½á¡£RxJava ²»½ö°Ñÿ¸öʼþµ¥¶À´¦Àí£¬»¹»á°ÑËüÃÇ¿´×öÒ»¸ö¶ÓÁС£RxJava ¹æ¶¨£¬µ±²»»áÔÙÓÐÐ嵀 onNext() ·¢³öʱ£¬ÐèÒª´¥·¢ onCompleted() ·½·¨×÷Ϊ±êÖ¾¡£

onError(): ʼþ¶ÓÁÐÒì³£¡£ÔÚʼþ´¦Àí¹ý³ÌÖгöÒ쳣ʱ£¬onError() »á±»´¥·¢£¬Í¬Ê±¶ÓÁÐ×Ô¶¯ÖÕÖ¹£¬²»ÔÊÐíÔÙÓÐʼþ·¢³ö¡£

ÔÚÒ»¸öÕýÈ·ÔËÐеÄʼþÐòÁÐÖÐ, onCompleted() ºÍ onError() ÓÐÇÒÖ»ÓÐÒ»¸ö£¬²¢ÇÒÊÇʼþÐòÁÐÖеÄ×îºóÒ»¸ö¡£ÐèҪעÒâµÄÊÇ£¬onCompleted() ºÍ onError() ¶þÕßÒ²ÊÇ»¥³âµÄ£¬¼´ÔÚ¶ÓÁÐÖе÷ÓÃÁËÆäÖÐÒ»¸ö£¬¾Í²»Ó¦¸ÃÔÙµ÷ÓÃÁíÒ»¸ö¡£

RxJava µÄ¹Û²ìÕßģʽ´óÖÂÈçÏÂͼ£º

RxJava µÄ¹Û²ìÕßģʽ

2. »ù±¾ÊµÏÖ

»ùÓÚÒÔÉϵĸÅÄ RxJava µÄ»ù±¾ÊµÏÖÖ÷ÒªÓÐÈýµã£º

1) ´´½¨ Observer

Observer ¼´¹Û²ìÕߣ¬Ëü¾ö¶¨Ê¼þ´¥·¢µÄʱºò½«ÓÐÔõÑùµÄÐÐΪ¡£ RxJava ÖÐµÄ Observer ½Ó¿ÚµÄʵÏÖ·½Ê½£º

Observer<String> observer = new Observer<String>() {
@Override
public void onNext(String s) {
Log.d(tag, "Item: " + s);
}

@Override
public void onCompleted() {
Log.d(tag, "Completed!");
}

@Override
public void onError(Throwable e) {
Log.d(tag, "Error!");
}
};

³ýÁË Observer ½Ó¿ÚÖ®Í⣬RxJava »¹ÄÚÖÃÁËÒ»¸öʵÏÖÁË Observer µÄ³éÏóÀࣺSubscriber¡£ Subscriber ¶Ô Observer ½Ó¿Ú½øÐÐÁËһЩÀ©Õ¹£¬µ«ËûÃǵĻù±¾Ê¹Ó÷½Ê½ÊÇÍêȫһÑùµÄ£º

Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onNext(String s) {
Log.d(tag, "Item: " + s);
}

@Override
public void onCompleted() {
Log.d(tag, "Completed!");
}

@Override
public void onError(Throwable e) {
Log.d(tag, "Error!");
}
};

²»½ö»ù±¾Ê¹Ó÷½Ê½Ò»Ñù£¬ÊµÖÊÉÏ£¬ÔÚ RxJava µÄ subscribe ¹ý³ÌÖУ¬Observer Ò²×ÜÊÇ»áÏȱ»×ª»»³ÉÒ»¸ö Subscriber ÔÙʹÓá£ËùÒÔÈç¹ûÄãÖ»ÏëʹÓûù±¾¹¦ÄÜ£¬Ñ¡Ôñ Observer ºÍ Subscriber ÊÇÍêȫһÑùµÄ¡£ËüÃǵÄÇø±ð¶ÔÓÚʹÓÃÕßÀ´ËµÖ÷ÒªÓÐÁ½µã£º

onStart(): ÕâÊÇ Subscriber Ôö¼ÓµÄ·½·¨¡£Ëü»áÔÚ subscribe ¸Õ¿ªÊ¼£¬¶øÊ¼þ»¹Î´·¢ËÍ֮ǰ±»µ÷Ó㬿ÉÒÔÓÃÓÚ×öһЩ׼±¸¹¤×÷£¬ÀýÈçÊý¾ÝµÄÇåÁã»òÖØÖá£ÕâÊÇÒ»¸ö¿ÉÑ¡·½·¨£¬Ä¬ÈÏÇé¿öÏÂËüµÄʵÏÖΪ¿Õ¡£ÐèҪעÒâµÄÊÇ£¬Èç¹û¶Ô×¼±¸¹¤×÷µÄÏß³ÌÓÐÒªÇó£¨ÀýÈ絯³öÒ»¸öÏÔʾ½ø¶ÈµÄ¶Ô»°¿ò£¬Õâ±ØÐëÔÚÖ÷Ïß³ÌÖ´ÐУ©£¬ onStart() ¾Í²»ÊÊÓÃÁË£¬ÒòΪËü×ÜÊÇÔÚ subscribe Ëù·¢ÉúµÄÏ̱߳»µ÷Ó㬶ø²»ÄÜÖ¸¶¨Ï̡߳£ÒªÔÚÖ¸¶¨µÄÏß³ÌÀ´×ö×¼±¸¹¤×÷£¬¿ÉÒÔʹÓà doOnSubscribe() ·½·¨£¬¾ßÌå¿ÉÒÔÔÚºóÃæµÄÎÄÖп´µ½¡£

unsubscribe(): ÕâÊÇ Subscriber ËùʵÏÖµÄÁíÒ»¸ö½Ó¿Ú Subscription µÄ·½·¨£¬ÓÃÓÚÈ¡Ïû¶©ÔÄ¡£ÔÚÕâ¸ö·½·¨±»µ÷Óúó£¬Subscriber ½«²»ÔÙ½ÓÊÕʼþ¡£Ò»°ãÔÚÕâ¸ö·½·¨µ÷ÓÃǰ£¬¿ÉÒÔʹÓà isUnsubscribed() ÏÈÅжÏÒ»ÏÂ״̬¡£ unsubscribe() Õâ¸ö·½·¨ºÜÖØÒª£¬ÒòΪÔÚ subscribe() Ö®ºó£¬ Observable »á³ÖÓÐ Subscriber µÄÒýÓã¬Õâ¸öÒýÓÃÈç¹û²»Äܼ°Ê±±»ÊÍ·Å£¬½«ÓÐÄÚ´æÐ¹Â¶µÄ·çÏÕ¡£ËùÒÔ×îºÃ±£³ÖÒ»¸öÔ­Ôò£ºÒªÔÚ²»ÔÙʹÓõÄʱºò¾¡¿ìÔÚºÏÊʵĵط½£¨ÀýÈç onPause() onStop() µÈ·½·¨ÖУ©µ÷Óà unsubscribe() À´½â³ýÒýÓùØÏµ£¬ÒÔ±ÜÃâÄÚ´æÐ¹Â¶µÄ·¢Éú¡£

2) ´´½¨ Observable

Observable ¼´±»¹Û²ìÕߣ¬Ëü¾ö¶¨Ê²Ã´Ê±ºò´¥·¢Ê¼þÒÔ¼°´¥·¢ÔõÑùµÄʼþ¡£ RxJava ʹÓà create() ·½·¨À´´´½¨Ò»¸ö Observable £¬²¢ÎªËü¶¨Òåʼþ´¥·¢¹æÔò£º

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Hi");
subscriber.onNext("Aloha");
subscriber.onCompleted();
}
});

¿ÉÒÔ¿´µ½£¬ÕâÀï´«ÈëÁËÒ»¸ö OnSubscribe ¶ÔÏó×÷Ϊ²ÎÊý¡£OnSubscribe »á±»´æ´¢ÔÚ·µ»ØµÄ Observable ¶ÔÏóÖУ¬ËüµÄ×÷ÓÃÏ൱ÓÚÒ»¸ö¼Æ»®±í£¬µ± Observable ±»¶©ÔĵÄʱºò£¬OnSubscribe µÄ call() ·½·¨»á×Ô¶¯±»µ÷Óã¬Ê¼þÐòÁоͻáÒÀÕÕÉ趨ÒÀ´Î´¥·¢£¨¶ÔÓÚÉÏÃæµÄ´úÂ룬¾ÍÊǹ۲ìÕßSubscriber ½«»á±»µ÷ÓÃÈý´Î onNext() ºÍÒ»´Î onCompleted()£©¡£ÕâÑù£¬Óɱ»¹Û²ìÕßµ÷ÓÃÁ˹۲ìÕߵĻص÷·½·¨£¬¾ÍʵÏÖÁËÓɱ»¹Û²ìÕßÏò¹Û²ìÕßµÄʼþ´«µÝ£¬¼´¹Û²ìÕßģʽ¡£

Õâ¸öÀý×Ӻܼòµ¥£ºÊ¼þµÄÄÚÈÝÊÇ×Ö·û´®£¬¶ø²»ÊÇһЩ¸´ÔӵĶÔÏó£»Ê¼þµÄÄÚÈÝÊÇÒѾ­¶¨ºÃÁ˵쬶ø²»ÏñÓеĹ۲ìÕßģʽһÑùÊÇ´ýÈ·¶¨µÄ£¨ÀýÈçÍøÂçÇëÇóµÄ½á¹ûÔÚÇëÇó·µ»ØÖ®Ç°ÊÇδ֪µÄ£©£»ËùÓÐʼþÔÚһ˲¼ä±»È«²¿·¢ËͳöÈ¥£¬¶ø²»ÊǼÐÔÓһЩȷ¶¨»ò²»È·¶¨µÄʱ¼ä¼ä¸ô»òÕß¾­¹ýijÖÖ´¥·¢Æ÷À´´¥·¢µÄ¡£×ÜÖ®£¬Õâ¸öÀý×Ó¿´ÆðÀ´ºÁÎÞʵÓüÛÖµ¡£µ«ÕâÊÇΪÁ˱ãÓÚ˵Ã÷£¬ÊµÖÊÉÏÖ»ÒªÄãÏ룬¸÷ÖÖ¸÷ÑùµÄʼþ·¢Ë͹æÔòÄã¶¼¿ÉÒÔ×Ô¼ºÀ´Ð´¡£ÖÁÓÚ¾ßÌåÔõô×ö£¬ºóÃæ¶¼»á½²µ½£¬µ«ÏÖÔÚ²»ÐС£Ö»Óаѻù´¡Ô­ÀíÏÈ˵Ã÷°×ÁË£¬ÉϲãµÄÔËÓòÅÄܸüÈÝÒ×˵Çå³þ¡£

create() ·½·¨ÊÇ RxJava ×î»ù±¾µÄ´´ÔìʼþÐòÁеķ½·¨¡£»ùÓÚÕâ¸ö·½·¨£¬ RxJava »¹ÌṩÁËһЩ·½·¨ÓÃÀ´¿ì½Ý´´½¨Ê¼þ¶ÓÁУ¬ÀýÈ磺

just(T...): ½«´«ÈëµÄ²ÎÊýÒÀ´Î·¢ËͳöÀ´¡£

Observable observable = Observable.just("Hello", "Hi", "Aloha");
// ½«»áÒÀ´Îµ÷Óãº
// onNext("Hello");
// onNext("Hi");
// onNext("Aloha");
// onCompleted();

from(T[]) / from(Iterable<? extends T>) : ½«´«ÈëµÄÊý×é»ò Iterable ²ð·Ö³É¾ßÌå¶ÔÏóºó£¬ÒÀ´Î·¢ËͳöÀ´¡£

String[] words = {"Hello", "Hi", "Aloha"};
Observable observable = Observable.from(words);
// ½«»áÒÀ´Îµ÷Óãº
// onNext("Hello");
// onNext("Hi");
// onNext("Aloha");
// onCompleted();

ÉÏÃæ just(T...) µÄÀý×ÓºÍ from(T[]) µÄÀý×Ó£¬¶¼ºÍ֮ǰµÄ create(OnSubscribe) µÄÀý×ÓÊǵȼ۵ġ£

3) Subscribe (¶©ÔÄ)

´´½¨ÁË Observable ºÍ Observer Ö®ºó£¬ÔÙÓà subscribe() ·½·¨½«ËüÃÇÁª½áÆðÀ´£¬ÕûÌõÁ´×ӾͿÉÒÔ¹¤×÷ÁË¡£´úÂëÐÎʽºÜ¼òµ¥£º

observable.subscribe(observer);
// »òÕߣº
observable.subscribe(subscriber);

ÓÐÈË¿ÉÄÜ»á×¢Òâµ½£¬ subscribe() Õâ¸ö·½·¨Óеã¹Ö£ºËü¿´ÆðÀ´ÊÇ¡ºobservalbe ¶©ÔÄÁË observer / subscriber¡»¶ø²»ÊÇ¡ºobserver / subscriber ¶©ÔÄÁË observalbe¡»£¬Õâ¿´ÆðÀ´¾ÍÏñ¡ºÔÓÖ¾¶©ÔÄÁ˶ÁÕß¡»Ò»Ñùµßµ¹Á˶ÔÏó¹ØÏµ¡£ÕâÈÃÈ˶ÁÆðÀ´Óеã±ðŤ£¬²»¹ýÈç¹û°Ñ API Éè¼Æ³É observer.subscribe(observable) / subscriber.subscribe(observable) £¬ËäÈ»¸ü¼Ó·ûºÏ˼άÂß¼­£¬µ«¶ÔÁ÷ʽ API µÄÉè¼Æ¾ÍÔì³ÉÓ°ÏìÁË£¬±È½ÏÆðÀ´Ã÷ÏÔÊǵò»³¥Ê§µÄ¡£

Observable.subscribe(Subscriber) µÄÄÚ²¿ÊµÏÖÊÇÕâÑùµÄ£¨½öºËÐÄ´úÂ룩£º

// ×¢Ò⣺Õâ²»ÊÇ subscribe() µÄÔ´Â룬¶øÊǽ«Ô´ÂëÖÐÓëÐÔÄÜ¡¢¼æÈÝÐÔ¡¢À©Õ¹ÐÔÓйصĴúÂëÌÞ³ýºóµÄºËÐÄ´úÂë¡£
// Èç¹ûÐèÒª¿´Ô´Â룬¿ÉÒÔÈ¥ RxJava µÄ GitHub ²Ö¿âÏÂÔØ¡£
public Subscription subscribe(Subscriber subscriber) {
subscriber.onStart();
onSubscribe.call(subscriber);
return subscriber;
}

¿ÉÒÔ¿´µ½£¬subscriber() ×öÁË3¼þÊ£º

1.µ÷Óà Subscriber.onStart() ¡£Õâ¸ö·½·¨ÔÚÇ°ÃæÒѾ­½éÉܹý£¬ÊÇÒ»¸ö¿ÉÑ¡µÄ×¼±¸·½·¨¡£

2.µ÷Óà Observable ÖÐµÄ OnSubscribe.call(Subscriber) ¡£ÔÚÕâÀʼþ·¢Ë͵ÄÂß¼­¿ªÊ¼ÔËÐС£´ÓÕâÒ²¿ÉÒÔ¿´³ö£¬ÔÚ RxJava ÖУ¬ Observable ²¢²»ÊÇÔÚ´´½¨µÄʱºò¾ÍÁ¢¼´¿ªÊ¼·¢ËÍʼþ£¬¶øÊÇÔÚËü±»¶©ÔĵÄʱºò£¬¼´µ± subscribe() ·½·¨Ö´ÐеÄʱºò¡£

3.½«´«ÈëµÄ Subscriber ×÷Ϊ Subscription ·µ»Ø¡£ÕâÊÇΪÁË·½±ã unsubscribe().

Õû¸ö¹ý³ÌÖжÔÏó¼äµÄ¹ØÏµÈçÏÂͼ£º

»òÕß¿ÉÒÔ¿´¶¯Í¼£º

³ýÁË subscribe(Observer) ºÍ subscribe(Subscriber) £¬subscribe() »¹Ö§³Ö²»ÍêÕû¶¨ÒåµÄ»Øµ÷£¬RxJava »á×Ô¶¯¸ù¾Ý¶¨Òå´´½¨³ö Subscriber ¡£ÐÎʽÈçÏ£º

Action1<String> onNextAction = new Action1<String>() {
// onNext()
@Override
public void call(String s) {
Log.d(tag, s);
}
};
Action1<Throwable> onErrorAction = new Action1<Throwable>() {
// onError()
@Override
public void call(Throwable throwable) {
// Error handling
}
};
Action0 onCompletedAction = new Action0() {
// onCompleted()
@Override
public void call() {
Log.d(tag, "completed");
}
};

// ×Ô¶¯´´½¨ Subscriber £¬²¢Ê¹Óà onNextAction À´¶¨Òå onNext()
observable.subscribe(onNextAction);
// ×Ô¶¯´´½¨ Subscriber £¬²¢Ê¹Óà onNextAction ºÍ onErrorAction À´¶¨Òå onNext() ºÍ onError()
observable.subscribe(onNextAction, onErrorAction);
// ×Ô¶¯´´½¨ Subscriber £¬²¢Ê¹Óà onNextAction¡¢ onErrorAction ºÍ onCompletedAction À´¶¨Òå onNext()¡¢ onError() ºÍ onCompleted()
observable.subscribe(onNextAction, onErrorAction, onCompletedAction);

¼òµ¥½âÊÍÒ»ÏÂÕâ¶Î´úÂëÖгöÏÖµÄ Action1 ºÍ Action0¡£ Action0 ÊÇ RxJava µÄÒ»¸ö½Ó¿Ú£¬ËüÖ»ÓÐÒ»¸ö·½·¨ call()£¬Õâ¸ö·½·¨ÊÇÎÞ²ÎÎÞ·µ»ØÖµµÄ£»ÓÉÓÚ onCompleted() ·½·¨Ò²ÊÇÎÞ²ÎÎÞ·µ»ØÖµµÄ£¬Òò´Ë Action0 ¿ÉÒÔ±»µ±³ÉÒ»¸ö°ü×°¶ÔÏ󣬽« onCompleted() µÄÄÚÈÝ´ò°üÆðÀ´½«×Ô¼º×÷Ϊһ¸ö²ÎÊý´«Èë subscribe() ÒÔʵÏÖ²»ÍêÕû¶¨ÒåµÄ»Øµ÷¡£ÕâÑùÆäʵҲ¿ÉÒÔ¿´×ö½« onCompleted() ·½·¨×÷Ϊ²ÎÊý´«½øÁË subscribe()£¬Ï൱ÓÚÆäËûijЩÓïÑÔÖеġº±Õ°ü¡»¡£ Action1 Ò²ÊÇÒ»¸ö½Ó¿Ú£¬ËüͬÑùÖ»ÓÐÒ»¸ö·½·¨ call(T param)£¬Õâ¸ö·½·¨Ò²ÎÞ·µ»ØÖµ£¬µ«ÓÐÒ»¸ö²ÎÊý£»Óë Action0 ͬÀí£¬ÓÉÓÚ onNext(T obj) ºÍ onError(Throwable error) Ò²Êǵ¥²ÎÊýÎÞ·µ»ØÖµµÄ£¬Òò´Ë Action1 ¿ÉÒÔ½« onNext(obj) ºÍ onError(error) ´ò°üÆðÀ´´«Èë subscribe() ÒÔʵÏÖ²»ÍêÕû¶¨ÒåµÄ»Øµ÷¡£ÊÂʵÉÏ£¬ËäÈ» Action0 ºÍ Action1 ÔÚ API ÖÐʹÓÃ×î¹ã·º£¬µ« RxJava ÊÇÌṩÁ˶à¸ö ActionX ÐÎʽµÄ½Ó¿Ú (ÀýÈç Action2, Action3) µÄ£¬ËüÃÇ¿ÉÒÔ±»ÓÃÒÔ°ü×°²»Í¬µÄÎÞ·µ»ØÖµµÄ·½·¨¡£

×¢£ºÕýÈçÇ°ÃæËùÌáµ½µÄ£¬Observer ºÍ Subscriber ¾ßÓÐÏàͬµÄ½ÇÉ«£¬¶øÇÒ Observer ÔÚ subscribe() ¹ý³ÌÖÐ×îÖջᱻת»»³É Subscriber ¶ÔÏó£¬Òò´Ë£¬´ÓÕâÀ↑ʼ£¬ºóÃæµÄÃèÊöÎÒ½«Óà Subscriber À´´úÌæ Observer £¬ÕâÑù¸ü¼ÓÑϽ÷¡£

4) ³¡¾°Ê¾Àý

ÏÂÃæ¾ÙÁ½¸öÀý×Ó£º

ΪÁ˰ÑÔ­ÀíÓøüÇåÎúµÄ·½Ê½±íÊö³öÀ´£¬±¾ÎÄÖÐÌôÑ¡µÄ¶¼Êǹ¦Äܾ¡¿ÉÄܼòµ¥µÄÀý×Ó£¬ÒÔÖÁÓÚÓÐЩʾÀý´úÂë¿´ÆðÀ´»áÓСº»­ÉßÌí×ã¡»¡ºÃ÷Ã÷²»Óà RxJava ¿ÉÒÔ¸ü¼ò±ãµØ½â¾öÎÊÌâ¡»µÄ¸Ð¾õ¡£µ±Äã¿´µ½ÕâÖÖÇé¿ö£¬²»Òª¾õµÃÊÇÒòΪ RxJava Ì«†ªà£¬¶øÊÇÒòΪÔÚ¹ýÔçµÄʱºò¾Ù³öÕæÊµ³¡¾°µÄÀý×Ó²¢²»ÀûÓÚÔ­ÀíµÄ½âÎö£¬Òò´ËÎÒ¿ÌÒâÌôÑ¡Á˼òµ¥µÄÇé¾°¡£

a. ´òÓ¡×Ö·û´®Êý×é

½«×Ö·û´®Êý×é names ÖеÄËùÓÐ×Ö·û´®ÒÀ´Î´òÓ¡³öÀ´£º

String[] names = ...;
Observable.from(names)
.subscribe(new Action1<String>() {
@Override
public void call(String name) {
Log.d(tag, name);
}
});

b. ÓÉ id È¡µÃͼƬ²¢ÏÔʾ

ÓÉÖ¸¶¨µÄÒ»¸ö drawable Îļþ id drawableRes È¡µÃͼƬ£¬²¢ÏÔʾÔÚ ImageView ÖУ¬²¢ÔÚ³öÏÖÒì³£µÄʱºò´òÓ¡ Toast ±¨´í£º

int drawableRes = ...;
ImageView imageView = ...;
Observable.create(new OnSubscribe<Drawable>() {
@Override
public void call(Subscriber<? super Drawable> subscriber) {
Drawable drawable = getTheme().getDrawable(drawableRes));
subscriber.onNext(drawable);
subscriber.onCompleted();
}
}).subscribe(new Observer<Drawable>() {
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}

@Override
public void onCompleted() {
}

@Override
public void onError(Throwable e) {
Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
}
});

ÕýÈçÉÏÃæÁ½¸öÀý×ÓÕâÑù£¬´´½¨³ö Observable ºÍ Subscriber £¬ÔÙÓà subscribe() ½«ËüÃÇ´®ÆðÀ´£¬Ò»´Î RxJava µÄ»ù±¾Ê¹ÓþÍÍê³ÉÁË¡£·Ç³£¼òµ¥¡£

È»¶ø£¬

ÕⲢûÓÐʲôdiaoÓÃ

ÔÚ RxJava µÄĬÈϹæÔòÖУ¬Ê¼þµÄ·¢³öºÍÏû·Ñ¶¼ÊÇÔÚͬһ¸öÏ̵߳ġ£Ò²¾ÍÊÇ˵£¬Èç¹ûÖ»ÓÃÉÏÃæµÄ·½·¨£¬ÊµÏÖ³öÀ´µÄÖ»ÊÇÒ»¸öͬ²½µÄ¹Û²ìÕßģʽ¡£¹Û²ìÕßģʽ±¾ÉíµÄÄ¿µÄ¾ÍÊÇ¡ººǫ́´¦Àí£¬Ç°Ì¨»Øµ÷¡»µÄÒì²½»úÖÆ£¬Òò´ËÒì²½¶ÔÓÚ RxJava ÊÇÖÁ¹ØÖØÒªµÄ¡£¶øÒªÊµÏÖÒì²½£¬ÔòÐèÒªÓõ½ RxJava µÄÁíÒ»¸ö¸ÅÄ Scheduler ¡£

3. Ï߳̿ØÖÆ ¡ª¡ª Scheduler (Ò»)

ÔÚ²»Ö¸¶¨Ï̵߳ÄÇé¿öÏ£¬ RxJava ×ñÑ­µÄÊÇÏ̲߳»±äµÄÔ­Ôò£¬¼´£ºÔÚÄĸöÏ̵߳÷Óà subscribe()£¬¾ÍÔÚÄĸöÏß³ÌÉú²úʼþ£»ÔÚÄĸöÏß³ÌÉú²úʼþ£¬¾ÍÔÚÄĸöÏß³ÌÏû·Ñʼþ¡£Èç¹ûÐèÒªÇл»Ị̈߳¬¾ÍÐèÒªÓõ½ Scheduler £¨µ÷¶ÈÆ÷£©¡£

1) Scheduler µÄ API (Ò»)

ÔÚRxJava ÖУ¬Scheduler ¡ª¡ªµ÷¶ÈÆ÷£¬Ï൱ÓÚÏ߳̿ØÖÆÆ÷£¬RxJava ͨ¹ýËüÀ´Ö¸¶¨Ã¿Ò»¶Î´úÂëÓ¦¸ÃÔËÐÐÔÚʲôÑùµÄÏ̡߳£RxJava ÒѾ­ÄÚÖÃÁ˼¸¸ö Scheduler £¬ËüÃÇÒѾ­Êʺϴó¶àÊýµÄʹÓó¡¾°£º

Schedulers.immediate(): Ö±½ÓÔÚµ±Ç°Ïß³ÌÔËÐУ¬Ï൱ÓÚ²»Ö¸¶¨Ï̡߳£ÕâÊÇĬÈ쵀 Scheduler¡£

Schedulers.newThread(): ×ÜÊÇÆôÓÃÐÂỊ̈߳¬²¢ÔÚÐÂÏß³ÌÖ´ÐвÙ×÷¡£

Schedulers.io(): I/O ²Ù×÷£¨¶ÁдÎļþ¡¢¶ÁдÊý¾Ý¿â¡¢ÍøÂçÐÅÏ¢½»»¥µÈ£©ËùʹÓÃµÄ Scheduler¡£ÐÐΪģʽºÍ newThread() ²î²»¶à£¬Çø±ðÔÚÓÚ io() µÄÄÚ²¿ÊµÏÖÊÇÊÇÓÃÒ»¸öÎÞÊýÁ¿ÉÏÏÞµÄÏ̳߳أ¬¿ÉÒÔÖØÓÿÕÏеÄỊ̈߳¬Òò´Ë¶àÊýÇé¿öÏ io() ±È newThread() ¸üÓÐЧÂÊ¡£²»Òª°Ñ¼ÆË㹤×÷·ÅÔÚ io() ÖУ¬¿ÉÒÔ±ÜÃâ´´½¨²»±ØÒªµÄÏ̡߳£

Schedulers.computation(): ¼ÆËãËùʹÓÃµÄ Scheduler¡£Õâ¸ö¼ÆËãÖ¸µÄÊÇ CPU Ãܼ¯ÐͼÆË㣬¼´²»»á±» I/O µÈ²Ù×÷ÏÞÖÆÐÔÄܵIJÙ×÷£¬ÀýÈçͼÐεļÆËã¡£Õâ¸ö Scheduler ʹÓõĹ̶¨µÄÏ̳߳أ¬´óСΪ CPU ºËÊý¡£²»Òª°Ñ I/O ²Ù×÷·ÅÔÚ computation() ÖУ¬·ñÔò I/O ²Ù×÷µÄµÈ´ýʱ¼ä»áÀË·Ñ CPU¡£

ÁíÍ⣬ Android »¹ÓÐÒ»¸öרÓÃµÄ AndroidSchedulers.mainThread()£¬ËüÖ¸¶¨µÄ²Ù×÷½«ÔÚ Android Ö÷Ïß³ÌÔËÐС£

ÓÐÁËÕ⼸¸ö Scheduler £¬¾Í¿ÉÒÔʹÓà subscribeOn() ºÍ observeOn() Á½¸ö·½·¨À´¶ÔÏ߳̽øÐпØÖÆÁË¡£ * subscribeOn(): Ö¸¶¨ subscribe() Ëù·¢ÉúµÄỊ̈߳¬¼´ Observable.OnSubscribe ±»¼¤»îʱËù´¦µÄÏ̡߳£»òÕß½Ð×öʼþ²úÉúµÄÏ̡߳£ * observeOn(): Ö¸¶¨ Subscriber ËùÔËÐÐÔÚµÄÏ̡߳£»òÕß½Ð×öʼþÏû·ÑµÄÏ̡߳£

ÎÄ×ÖÐðÊö×ܹéÄÑÀí½â£¬ÉÏ´úÂ룺

Observable.just(1, 2, 3, 4)
.subscribeOn(Schedulers.io()) // Ö¸¶¨ subscribe() ·¢ÉúÔÚ IO Ïß³Ì
.observeOn(AndroidSchedulers.mainThread()) // Ö¸¶¨ Subscriber µÄ»Øµ÷·¢ÉúÔÚÖ÷Ïß³Ì
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer number) {
Log.d(tag, "number:" + number);
}
});

ÉÏÃæÕâ¶Î´úÂëÖУ¬ÓÉÓÚ subscribeOn(Schedulers.io()) µÄÖ¸¶¨£¬±»´´½¨µÄʼþµÄÄÚÈÝ 1¡¢2¡¢3¡¢4 ½«»áÔÚ IO Ï̷߳¢³ö£»¶øÓÉÓÚ observeOn(AndroidScheculers.mainThread()) µÄÖ¸¶¨£¬Òò´Ë subscriber Êý×ֵĴòÓ¡½«·¢ÉúÔÚÖ÷Ïß³Ì ¡£ÊÂʵÉÏ£¬ÕâÖÖÔÚ subscribe() ֮ǰдÉÏÁ½¾ä subscribeOn(Scheduler.io()) ºÍ observeOn(AndroidSchedulers.mainThread()) µÄʹÓ÷½Ê½·Ç³£³£¼û£¬ËüÊÊÓÃÓÚ¶àÊýµÄ ¡ººǫ́Ïß³ÌÈ¡Êý¾Ý£¬Ö÷Ïß³ÌÏÔʾ¡»µÄ³ÌÐò²ßÂÔ¡£

¶øÇ°ÃæÌáµ½µÄÓÉͼƬ id È¡µÃͼƬ²¢ÏÔʾµÄÀý×Ó£¬Èç¹ûÒ²¼ÓÉÏÕâÁ½¾ä£º

int drawableRes = ...;
ImageView imageView = ...;
Observable.create(new OnSubscribe<Drawable>() {
@Override
public void call(Subscriber<? super Drawable> subscriber) {
Drawable drawable = getTheme().getDrawable(drawableRes));
subscriber.onNext(drawable);
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io()) // Ö¸¶¨ subscribe() ·¢ÉúÔÚ IO Ïß³Ì
.observeOn(AndroidSchedulers.mainThread()) // Ö¸¶¨ Subscriber µÄ»Øµ÷·¢ÉúÔÚÖ÷Ïß³Ì
.subscribe(new Observer<Drawable>() {
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}

@Override
public void onCompleted() {
}

@Override
public void onError(Throwable e) {
Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
}
});

ÄÇô£¬¼ÓÔØÍ¼Æ¬½«»á·¢ÉúÔÚ IO Ị̈߳¬¶øÉèÖÃͼƬÔò±»É趨ÔÚÁËÖ÷Ï̡߳£Õâ¾ÍÒâζ×Å£¬¼´Ê¹¼ÓÔØÍ¼Æ¬ºÄ·ÑÁ˼¸Ê®ÉõÖÁ¼¸°ÙºÁÃëµÄʱ¼ä£¬Ò²²»»áÔì³ÉË¿ºÁ½çÃæµÄ¿¨¶Ù¡£

2) Scheduler µÄÔ­Àí (Ò»)

RxJava µÄ Scheduler API ºÜ·½±ã£¬Ò²ºÜÉñÆæ£¨¼ÓÁËÒ»¾ä»°¾Í°ÑÏß³ÌÇл»ÁË£¬Ôõô×öµ½µÄ£¿¶øÇÒ subscribe() ²»ÊÇ×îÍâ²ãÖ±½Óµ÷Óõķ½·¨Âð£¬Ëü¾¹È»Ò²Äܱ»Ö¸¶¨Ị̈߳¿£©¡£È»¶ø Scheduler µÄÔ­ÀíÐèÒª·ÅÔÚºóÃæ½²£¬ÒòΪËüµÄÔ­ÀíÊÇÒÔÏÂÒ»½Ú¡¶±ä»»¡·µÄÔ­Àí×÷Ϊ»ù´¡µÄ¡£

ºÃ°ÉÕâÒ»½ÚÆäʵÎÒÆ¨Ò²Ã»Ëµ£¬Ö»ÊÇΪÁËÈÃÄã°²ÐÄ£¬ÈÃÄãÖªµÀÎÒ²»ÊÇÍüÁ˽²Ô­Àí£¬¶øÊǰÑËü·ÅÔÚÁ˸üºÏÊʵĵط½¡£

4. 񄯯

ÖÕÓÚÒªµ½Å£±ÆµÄµØ·½ÁË£¬²»¹ÜÄ㼤¶¯²»¼¤¶¯£¬·´ÕýÎÒÊǼ¤¶¯ÁË¡£

RxJava ÌṩÁ˶ÔʼþÐòÁнøÐб任µÄÖ§³Ö£¬ÕâÊÇËüµÄºËÐŦÄÜÖ®Ò»£¬Ò²ÊÇ´ó¶àÊýÈË˵¡ºRxJava ÕæÊÇÌ«ºÃÓÃÁË¡»µÄ×î´óÔ­Òò¡£Ëùν±ä»»£¬¾ÍÊǽ«Ê¼þÐòÁÐÖеĶÔÏó»òÕû¸öÐòÁнøÐмӹ¤´¦Àí£¬×ª»»³É²»Í¬µÄʼþ»òʼþÐòÁС£¸ÅÄî˵×Å×ÜÊÇÄ£ºýÄѶ®µÄ£¬À´¿´ API¡£

1) API

Ê×ÏÈ¿´Ò»¸ö map() µÄÀý×Ó£º

Observable.just("images/logo.png") // ÊäÈëÀàÐÍ String
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String filePath) { // ²ÎÊýÀàÐÍ String
return getBitmapFromPath(filePath); // ·µ»ØÀàÐÍ Bitmap
}
})
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) { // ²ÎÊýÀàÐÍ Bitmap
showBitmap(bitmap);
}
});

ÕâÀï³öÏÖÁËÒ»¸ö½Ð×ö Func1 µÄÀà¡£ËüºÍ Action1 ·Ç³£ÏàËÆ£¬Ò²ÊÇ RxJava µÄÒ»¸ö½Ó¿Ú£¬ÓÃÓÚ°ü×°º¬ÓÐÒ»¸ö²ÎÊýµÄ·½·¨¡£ Func1 ºÍ Action µÄÇø±ðÔÚÓÚ£¬ Func1 °ü×°µÄÊÇÓзµ»ØÖµµÄ·½·¨¡£ÁíÍ⣬ºÍ ActionX Ò»Ñù£¬ FuncX Ò²Óжà¸ö£¬ÓÃÓÚ²»Í¬²ÎÊý¸öÊýµÄ·½·¨¡£FuncX ºÍ ActionX µÄÇø±ðÔÚ FuncX °ü×°µÄÊÇÓзµ»ØÖµµÄ·½·¨¡£

¿ÉÒÔ¿´µ½£¬map() ·½·¨½«²ÎÊýÖÐµÄ String ¶ÔÏóת»»³ÉÒ»¸ö Bitmap ¶ÔÏóºó·µ»Ø£¬¶øÔÚ¾­¹ý map() ·½·¨ºó£¬Ê¼þµÄ²ÎÊýÀàÐÍÒ²ÓÉ String תΪÁË Bitmap¡£ÕâÖÖÖ±½Ó±ä»»¶ÔÏó²¢·µ»ØµÄ£¬ÊÇ×î³£¼ûµÄÒ²×îÈÝÒ×Àí½âµÄ±ä»»¡£²»¹ý RxJava µÄ±ä»»Ô¶²»Ö¹ÕâÑù£¬Ëü²»½ö¿ÉÒÔÕë¶Ôʼþ¶ÔÏ󣬻¹¿ÉÒÔÕë¶ÔÕû¸öʼþ¶ÓÁУ¬ÕâʹµÃ RxJava ±äµÃ·Ç³£Áé»î¡£ÎÒÁоټ¸¸ö³£Óõı任£º

map(): ʼþ¶ÔÏóµÄÖ±½Ó±ä»»£¬¾ßÌ幦ÄÜÉÏÃæÒѾ­½éÉܹý¡£ËüÊÇ RxJava ×î³£Óõı任¡£ map() µÄʾÒâͼ£º map() ʾÒâͼ

flatMap(): ÕâÊÇÒ»¸öºÜÓÐÓõ«·Ç³£ÄÑÀí½âµÄ±ä»»£¬Òò´ËÎÒ¾ö¶¨»¨¶àЩƪ·ùÀ´½éÉÜËü¡£ Ê×ÏȼÙÉèÕâôһÖÖÐèÇ󣺼ÙÉèÓÐÒ»¸öÊý¾Ý½á¹¹¡ºÑ§Éú¡»£¬ÏÖÔÚÐèÒª´òÓ¡³öÒ»×éѧÉúµÄÃû×Ö¡£ÊµÏÖ·½Ê½ºÜ¼òµ¥£º

Student[] students = ...;
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onNext(String name) {
Log.d(tag, name);
}
...
};
Observable.from(students)
.map(new Func1<Student, String>() {
@Override
public String call(Student student) {
return student.getName();
}
})
.subscribe(subscriber);

ºÜ¼òµ¥¡£ÄÇôÔÙ¼ÙÉ裺Èç¹ûÒª´òÓ¡³öÿ¸öѧÉúËùÐèÒªÐÞµÄËùÓпγ̵ÄÃû³ÆÄØ£¿£¨ÐèÇóµÄÇø±ðÔÚÓÚ£¬Ã¿¸öѧÉúÖ»ÓÐÒ»¸öÃû×Ö£¬µ«È´Óжà¸ö¿Î³Ì¡££©Ê×ÏÈ¿ÉÒÔÕâÑùʵÏÖ£º

Student[] students = ...;
Subscriber<Student> subscriber = new Subscriber<Student>() {
@Override
public void onNext(Student student) {
List<Course> courses = student.getCourses();
for (int i = 0; i < courses.size(); i++) {
Course course = courses.get(i);
Log.d(tag, course.getName());
}
}
...
};
Observable.from(students)
.subscribe(subscriber);

ÒÀÈ»ºÜ¼òµ¥¡£ÄÇôÈç¹ûÎÒ²»ÏëÔÚ Subscriber ÖÐʹÓà for Ñ­»·£¬¶øÊÇÏ£Íû Subscriber ÖÐÖ±½Ó´«Èëµ¥¸öµÄ Course ¶ÔÏóÄØ£¨Õâ¶ÔÓÚ´úÂ븴ÓúÜÖØÒª£©£¿Óà map() ÏÔÈ»ÊDz»Ðеģ¬ÒòΪ map() ÊÇÒ»¶ÔÒ»µÄת»¯£¬¶øÎÒÏÖÔÚµÄÒªÇóÊÇÒ»¶Ô¶àµÄת»¯¡£ÄÇÔõô²ÅÄܰÑÒ»¸ö Student ת»¯³É¶à¸ö Course ÄØ£¿

Õâ¸öʱºò£¬¾ÍÐèÒªÓà flatMap() ÁË£º

Student[] students = ...;
Subscriber<Course> subscriber = new Subscriber<Course>() {
@Override
public void onNext(Course course) {
Log.d(tag, course.getName());
}
...
};
Observable.from(students)
.flatMap(new Func1<Student, Observable<Course>>() {
@Override
public Observable<Course> call(Student student) {
return Observable.from(student.getCourses());
}
})
.subscribe(subscriber);

´ÓÉÏÃæµÄ´úÂë¿ÉÒÔ¿´³ö£¬ flatMap() ºÍ map() ÓÐÒ»¸öÏàͬµã£ºËüÒ²ÊǰѴ«ÈëµÄ²ÎÊýת»¯Ö®ºó·µ»ØÁíÒ»¸ö¶ÔÏó¡£µ«ÐèҪעÒ⣬ºÍ map() ²»Í¬µÄÊÇ£¬ flatMap() Öзµ»ØµÄÊǸö Observable ¶ÔÏ󣬲¢ÇÒÕâ¸ö Observable ¶ÔÏó²¢²»ÊDZ»Ö±½Ó·¢Ë͵½ÁË Subscriber µÄ»Øµ÷·½·¨ÖС£ flatMap() µÄÔ­ÀíÊÇÕâÑùµÄ£º1. ʹÓô«ÈëµÄʼþ¶ÔÏó´´½¨Ò»¸ö Observable ¶ÔÏó£»2. ²¢²»·¢ËÍÕâ¸ö Observable, ¶øÊǽ«Ëü¼¤»î£¬ÓÚÊÇËü¿ªÊ¼·¢ËÍʼþ£»3. ÿһ¸ö´´½¨³öÀ´µÄ Observable ·¢Ë͵Äʼþ£¬¶¼±»»ãÈëͬһ¸ö Observable £¬¶øÕâ¸ö Observable ¸ºÔð½«ÕâЩʼþͳһ½»¸ø Subscriber µÄ»Øµ÷·½·¨¡£ÕâÈý¸ö²½Ö裬°Ñʼþ²ð³ÉÁËÁ½¼¶£¬Í¨¹ýÒ»×éд´½¨µÄ Observable ½«³õʼµÄ¶ÔÏó¡ºÆÌÆ½¡»Ö®ºóͨ¹ýͳһ·¾¶·Ö·¢ÁËÏÂÈ¥¡£¶øÕâ¸ö¡ºÆÌƽ¡»¾ÍÊÇ flatMap() ËùνµÄ flat¡£

flatMap() ʾÒâͼ£º

À©Õ¹£ºÓÉÓÚ¿ÉÒÔÔÚǶÌ×µÄ Observable ÖÐÌí¼ÓÒì²½´úÂ룬 flatMap() Ò²³£ÓÃÓÚǶÌ×µÄÒì²½²Ù×÷£¬ÀýÈçǶÌ×µÄÍøÂçÇëÇó¡£Ê¾Àý´úÂ루Retrofit + RxJava£©£º

networkClient.token() // ·µ»Ø Observable<String>£¬ÔÚ¶©ÔÄʱÇëÇó token£¬²¢ÔÚÏìÓ¦ºó·¢ËÍ token
.flatMap(new Func1<String, Observable<Messages>>() {
@Override
public Observable<Messages> call(String token) {
// ·µ»Ø Observable<Messages>£¬ÔÚ¶©ÔÄʱÇëÇóÏûÏ¢ÁÐ±í£¬²¢ÔÚÏìÓ¦ºó·¢ËÍÇëÇóµ½µÄÏûÏ¢Áбí
return networkClient.messages();
}
})
.subscribe(new Action1<Messages>() {
@Override
public void call(Messages messages) {
// ´¦ÀíÏÔʾÏûÏ¢Áбí
showMessages(messages);
}
});

´«Í³µÄǶÌ×ÇëÇóÐèҪʹÓÃǶÌ×µÄ Callback À´ÊµÏÖ¡£¶øÍ¨¹ý flatMap() £¬¿ÉÒÔ°ÑǶÌ×µÄÇëÇóдÔÚÒ»ÌõÁ´ÖУ¬´Ó¶ø±£³Ö³ÌÐòÂß¼­µÄÇåÎú¡£

throttleFirst(): ÔÚÿ´Îʼþ´¥·¢ºóµÄÒ»¶¨Ê±¼ä¼ä¸ôÄÚ¶ªÆúеÄʼþ¡£³£ÓÃ×÷È¥¶¶¶¯¹ýÂË£¬ÀýÈç°´Å¥µÄµã»÷¼àÌýÆ÷£º RxView.clickEvents(button) // RxBinding ´úÂ룬ºóÃæµÄÎÄÕÂÓнâÊÍ .throttleFirst(500, TimeUnit.MILLISECONDS) // ÉèÖ÷À¶¶¼ä¸ôΪ 500ms .subscribe(subscriber); ÂèÂèÔÙÒ²²»ÅÂÎÒµÄÓû§ÊÖ¶¶µã¿ªÁ½¸öÖØ¸´µÄ½çÃæÀ²¡£

´ËÍ⣬ RxJava »¹ÌṩºÜ¶à±ã½ÝµÄ·½·¨À´ÊµÏÖʼþÐòÁеı任£¬ÕâÀï¾Í²»Ò»Ò»¾ÙÀýÁË¡£

2) ±ä»»µÄÔ­Àí£ºlift()

ÕâЩ±ä»»ËäÈ»¹¦Äܸ÷Óв»Í¬£¬µ«ÊµÖÊÉ϶¼ÊÇÕë¶ÔʼþÐòÁеĴ¦ÀíºÍÔÙ·¢ËÍ¡£¶øÔÚ RxJava µÄÄÚ²¿£¬ËüÃÇÊÇ»ùÓÚͬһ¸ö»ù´¡µÄ±ä»»·½·¨£º lift(Operator)¡£Ê×ÏÈ¿´Ò»Ï lift() µÄÄÚ²¿ÊµÏÖ£¨½öºËÐÄ´úÂ룩£º

<table width="60%" border="0" align="center" cellpadding="7" cellspacing="1" bgcolor="#CCCCCC" class="content">
<tr >
<td height="25" bgcolor="#f5f5f5" id="dai">
<p style="text-indent: 0em;">Hello World!</p></td>
</tr>
</table>

Õâ¶Î´úÂëºÜÓÐÒâ˼£ºËüÉú³ÉÁËÒ»¸öÐ嵀 Observable ²¢·µ»Ø£¬¶øÇÒ´´½¨Ð Observable ËùÓõIJÎÊý OnSubscribe µÄ»Øµ÷·½·¨ call() ÖеÄʵÏÖ¾¹È»¿´ÆðÀ´ºÍÇ°Ãæ½²¹ýµÄ Observable.subscribe() Ò»Ñù£¡È»¶øËüÃDz¢²»Ò»ÑùÓ´~²»Ò»ÑùµÄµØ·½¹Ø¼ü¾ÍÔÚÓÚµÚ¶þÐÐ onSubscribe.call(subscriber) ÖÐµÄ onSubscribe ËùÖ¸´úµÄ¶ÔÏó²»Í¬£¨¸ßÄÜÔ¤¾¯£º½ÓÏÂÀ´µÄ¼¸¾ä»°¿ÉÄܻᵼÖÂÉíÌåµÄÑÏÖØ²»ÊÊ£©¡ª¡ª

subscribe() ÖÐÕâ¾ä»°µÄ onSubscribe Ö¸µÄÊÇ Observable ÖÐµÄ onSubscribe ¶ÔÏó£¬Õâ¸öûÓÐÎÊÌ⣬µ«ÊÇ lift() Ö®ºóµÄÇé¿ö¾Í¸´ÔÓÁ˵㡣

µ±º¬ÓÐ lift() ʱ£º

1.lift() ´´½¨ÁËÒ»¸ö Observable ºó£¬¼ÓÉÏ֮ǰµÄԭʼ Observable£¬ÒѾ­ÓÐÁ½¸ö Observable ÁË£»

2.¶øÍ¬ÑùµØ£¬Ð Observable ÀïµÄРOnSubscribe ¼ÓÉÏ֮ǰµÄԭʼ Observable ÖеÄԭʼ OnSubscribe£¬Ò²¾ÍÓÐÁËÁ½¸ö OnSubscribe£»

3.µ±Óû§µ÷Óþ­¹ý lift() ºóµÄ Observable µÄ subscribe() µÄʱºò£¬Ê¹ÓõÄÊÇ lift() Ëù·µ»ØµÄÐ嵀 Observable £¬ÓÚÊÇËüËù´¥·¢µÄ onSubscribe.call(subscriber)£¬Ò²ÊÇÓõÄРObservable ÖеÄРOnSubscribe£¬¼´ÔÚ lift() ÖÐÉú³ÉµÄÄǸö OnSubscribe£»

4.¶øÕâ¸öРOnSubscribe µÄ call() ·½·¨ÖÐµÄ onSubscribe £¬¾ÍÊÇÖ¸µÄԭʼ Observable ÖеÄԭʼ OnSubscribe £¬ÔÚÕâ¸ö call() ·½·¨ÀРOnSubscribe ÀûÓà operator.call(subscriber) Éú³ÉÁËÒ»¸öÐ嵀 Subscriber£¨Operator ¾ÍÊÇÔÚÕâÀͨ¹ý×Ô¼ºµÄ call() ·½·¨½«Ð Subscriber ºÍԭʼ Subscriber ½øÐйØÁª£¬²¢²åÈë×Ô¼ºµÄ¡º±ä»»¡»´úÂëÒÔʵÏֱ任£©£¬È»ºóÀûÓÃÕâ¸öРSubscriber Ïòԭʼ Observable ½øÐж©ÔÄ¡£

ÕâÑù¾ÍʵÏÖÁË lift() ¹ý³Ì£¬ÓеãÏñÒ»ÖÖ´úÀí»úÖÆ£¬Í¨¹ýʼþÀ¹½ØºÍ´¦ÀíʵÏÖʼþÐòÁеı任¡£

¾«¼òµôϸ½ÚµÄ»°£¬Ò²¿ÉÒÔÕâô˵£ºÔÚ Observable Ö´ÐÐÁË lift(Operator) ·½·¨Ö®ºó£¬»á·µ»ØÒ»¸öÐ嵀 Observable£¬Õâ¸öÐ嵀 Observable »áÏñÒ»¸ö´úÀíÒ»Ñù£¬¸ºÔð½ÓÊÕԭʼµÄ Observable ·¢³öµÄʼþ£¬²¢ÔÚ´¦Àíºó·¢Ë͸ø Subscriber¡£

Èç¹ûÄã¸üϲ»¶¾ßÏó˼ά£¬¿ÉÒÔ¿´Í¼£º

»òÕß¿ÉÒÔ¿´Í¼£º

Á½´ÎºÍ¶à´ÎµÄ lift() ͬÀí£¬ÈçÏÂͼ£º

Á½´Î lift

¾ÙÒ»¸ö¾ßÌåµÄ Operator µÄʵÏÖ¡£ÏÂÃæÕâÊÇÒ»¸ö½«Ê¼þÖÐµÄ Integer ¶ÔÏóת»»³É String µÄÀý×Ó£¬½ö¹©²Î¿¼£º

observable.lift(new Observable.Operator<String, Integer>() {
@Override
public Subscriber<? super Integer> call(final Subscriber<? super String> subscriber) {
// ½«Ê¼þÐòÁÐÖÐµÄ Integer ¶ÔÏóת»»Îª String ¶ÔÏó
return new Subscriber<Integer>() {
@Override
public void onNext(Integer integer) {
subscriber.onNext("" + integer);
}

@Override
public void onCompleted() {
subscriber.onCompleted();
}

@Override
public void onError(Throwable e) {
subscriber.onError(e);
}
};
}
});

½²Êö lift() µÄÔ­ÀíÖ»ÊÇΪÁËÈÃÄã¸üºÃµØÁ˽â RxJava £¬´Ó¶ø¿ÉÒÔ¸üºÃµØÊ¹ÓÃËü¡£È»¶ø²»¹ÜÄãÊÇ·ñÀí½âÁË lift() µÄÔ­Àí£¬RxJava ¶¼²»½¨Ò鿪·¢Õß×Ô¶¨Òå Operator À´Ö±½ÓʹÓà lift()£¬¶øÊǽ¨Ò龡Á¿Ê¹ÓÃÒÑÓÐµÄ lift() °ü×°·½·¨£¨Èç map() flatMap() µÈ£©½øÐÐ×éºÏÀ´ÊµÏÖÐèÇó£¬ÒòΪֱ½ÓʹÓà lift() ·Ç³£ÈÝÒ×·¢ÉúһЩÄÑÒÔ·¢ÏֵĴíÎó¡£

3) compose: ¶Ô Observable ÕûÌåµÄ±ä»»

³ýÁË lift() Ö®Í⣬ Observable »¹ÓÐÒ»¸ö±ä»»·½·¨½Ð×ö compose(Transformer)¡£ËüºÍ lift() µÄÇø±ðÔÚÓÚ£¬ lift() ÊÇÕë¶ÔʼþÏîºÍʼþÐòÁе쬶ø compose() ÊÇÕë¶Ô Observable ×ÔÉí½øÐб任¡£¾Ù¸öÀý×Ó£¬¼ÙÉèÔÚ³ÌÐòÖÐÓжà¸ö Observable £¬²¢ÇÒËûÃǶ¼ÐèÒªÓ¦ÓÃÒ»×éÏàͬµÄ lift() ±ä»»¡£Äã¿ÉÒÔÕâôд£º

observable1
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber1);
observable2
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber2);
observable3
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber3);
observable4
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber1);

Äã¾õµÃÕâÑùÌ«²»Èí¼þ¹¤³ÌÁË£¬ÓÚÊÇÄã¸Ä³ÉÁËÕâÑù£º

private Observable liftAll(Observable observable) {
return observable
.lift1()
.lift2()
.lift3()
.lift4();
}
...
liftAll(observable1).subscribe(subscriber1);
liftAll(observable2).subscribe(subscriber2);
liftAll(observable3).subscribe(subscriber3);
liftAll(observable4).subscribe(subscriber4);

¿É¶ÁÐÔ¡¢¿Éά»¤ÐÔ¶¼Ìá¸ßÁË¡£¿ÉÊÇ Observable ±»Ò»¸ö·½·¨°üÆðÀ´£¬ÕâÖÖ·½Ê½¶ÔÓÚ Observale µÄÁé»îÐÔËÆºõ»¹ÊÇÔöÌíÁËÄÇôµãÏÞÖÆ¡£Ôõô°ì£¿Õâ¸öʱºò£¬¾ÍÓ¦¸ÃÓà compose() À´½â¾öÁË£º

public class LiftAllTransformer implements Observable.Transformer<Integer, String> {
@Override
public Observable<String> call(Observable<Integer> observable) {
return observable
.lift1()
.lift2()
.lift3()
.lift4();
}
}
...
Transformer liftAll = new LiftAllTransformer();
observable1.compose(liftAll).subscribe(subscriber1);
observable2.compose(liftAll).subscribe(subscriber2);
observable3.compose(liftAll).subscribe(subscriber3);
observable4.compose(liftAll).subscribe(subscriber4);

ÏñÉÏÃæÕâÑù£¬Ê¹Óà compose() ·½·¨£¬Observable ¿ÉÒÔÀûÓô«ÈëµÄ Transformer ¶ÔÏóµÄ call ·½·¨Ö±½Ó¶Ô×ÔÉí½øÐд¦Àí£¬Ò²¾Í²»±Ø±»°üÔÚ·½·¨µÄÀïÃæÁË¡£

compose() µÄÔ­Àí±È½Ï¼òµ¥£¬²»¸½Í¼à¶¡£

5. Ï߳̿ØÖÆ£ºScheduler (¶þ)

³ýÁËÁé»îµÄ±ä»»£¬RxJava ÁíÒ»¸öÅ£±ÆµÄµØ·½£¬¾ÍÊÇÏ̵߳Ä×ÔÓÉ¿ØÖÆ¡£

1) Scheduler µÄ API (¶þ)

Ç°Ãæ½²µ½ÁË£¬¿ÉÒÔÀûÓà subscribeOn() ½áºÏ observeOn() À´ÊµÏÖÏ߳̿ØÖÆ£¬ÈÃʼþµÄ²úÉúºÍÏû·Ñ·¢ÉúÔÚ²»Í¬µÄÏ̡߳£¿ÉÊÇÔÚÁ˽âÁË map() flatMap() µÈ±ä»»·½·¨ºó£¬ÓÐЩºÃÊµģ¨Æäʵ¾ÍÊǵ±³õ¸Õ½Ó´¥ RxJava ʱµÄÎÒ£©¾ÍÎÊÁË£ºÄܲ»ÄܶàÇл»¼¸´ÎỊ̈߳¿

´ð°¸ÊÇ£ºÄÜ¡£ÒòΪ observeOn() Ö¸¶¨µÄÊÇ Subscriber µÄỊ̈߳¬¶øÕâ¸ö Subscriber ²¢²»ÊÇ£¨Ñϸñ˵Ӧ¸ÃΪ¡º²»Ò»¶¨ÊÇ¡»£¬µ«ÕâÀï²»·ÁÀí½âΪ¡º²»ÊÇ¡»£©subscribe() ²ÎÊýÖÐµÄ Subscriber £¬¶øÊÇ observeOn() Ö´ÐÐʱµÄµ±Ç° Observable Ëù¶ÔÓ¦µÄ Subscriber £¬¼´ËüµÄÖ±½Óϼ¶ Subscriber ¡£»»¾ä»°Ëµ£¬observeOn() Ö¸¶¨µÄÊÇËüÖ®ºóµÄ²Ù×÷ËùÔÚµÄÏ̡߳£Òò´ËÈç¹ûÓжà´ÎÇл»Ï̵߳ÄÐèÇó£¬Ö»ÒªÔÚÿ¸öÏëÒªÇл»Ï̵߳ÄλÖõ÷ÓÃÒ»´Î observeOn() ¼´¿É¡£ÉÏ´úÂ룺

Observable.just(1, 2, 3, 4) // IO Ị̈߳¬ÓÉ subscribeOn() Ö¸¶¨
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(mapOperator) // ÐÂỊ̈߳¬ÓÉ observeOn() Ö¸¶¨
.observeOn(Schedulers.io())
.map(mapOperator2) // IO Ị̈߳¬ÓÉ observeOn() Ö¸¶¨
.observeOn(AndroidSchedulers.mainThread)
.subscribe(subscriber); // Android Ö÷Ị̈߳¬ÓÉ observeOn() Ö¸¶¨

ÈçÉÏ£¬Í¨¹ý observeOn() µÄ¶à´Îµ÷Ó㬳ÌÐòʵÏÖÁËÏ̵߳Ķà´ÎÇл»¡£

²»¹ý£¬²»Í¬ÓÚ observeOn() £¬ subscribeOn() µÄλÖ÷ÅÔÚÄÄÀï¶¼¿ÉÒÔ£¬µ«ËüÊÇÖ»Äܵ÷ÓÃÒ»´ÎµÄ¡£

ÓÖÓкÃÊµģ¨Æäʵ»¹Êǵ±³õµÄÎÒ£©ÎÊÁË£ºÈç¹ûÎÒ·ÇÒªµ÷Óöà´Î subscribeOn() ÄØ£¿»áÓÐʲôЧ¹û£¿

Õâ¸öÎÊÌâÏÈ·Å×Å£¬ÎÒÃÇ»¹ÊÇ´Ó RxJava Ï߳̿ØÖƵÄÔ­Àí˵Æð°É¡£

2) Scheduler µÄÔ­Àí£¨¶þ£©

Æäʵ£¬ subscribeOn() ºÍ observeOn() µÄÄÚ²¿ÊµÏÖ£¬Ò²ÊÇÓÃµÄ lift()¡£¾ßÌ忴ͼ£¨²»Í¬ÑÕÉ«µÄ¼ýÍ·±íʾ²»Í¬µÄỊ̈߳©£º

subscribeOn() Ô­Àíͼ£º

observeOn() Ô­Àíͼ£º

´ÓͼÖпÉÒÔ¿´³ö£¬subscribeOn() ºÍ observeOn() ¶¼×öÁËÏß³ÌÇл»µÄ¹¤×÷£¨Í¼ÖÐµÄ "schedule..." ²¿Î»£©¡£²»Í¬µÄÊÇ£¬ subscribeOn() µÄÏß³ÌÇл»·¢ÉúÔÚ OnSubscribe ÖУ¬¼´ÔÚËü֪ͨÉÏÒ»¼¶ OnSubscribe ʱ£¬Õâʱʼþ»¹Ã»ÓпªÊ¼·¢ËÍ£¬Òò´Ë subscribeOn() µÄÏ߳̿ØÖÆ¿ÉÒÔ´Óʼþ·¢³öµÄ¿ª¶Ë¾ÍÔì³ÉÓ°Ï죻¶ø observeOn() µÄÏß³ÌÇл»Ôò·¢ÉúÔÚËüÄÚ½¨µÄ Subscriber ÖУ¬¼´·¢ÉúÔÚËü¼´½«¸øÏÂÒ»¼¶ Subscriber ·¢ËÍʼþʱ£¬Òò´Ë observeOn() ¿ØÖƵÄÊÇËüºóÃæµÄÏ̡߳£

×îºó£¬ÎÒÓÃÒ»ÕÅͼÀ´½âÊ͵±¶à¸ö subscribeOn() ºÍ observeOn() »ìºÏʹÓÃʱ£¬Ï̵߳÷¶ÈÊÇÔõô·¢ÉúµÄ£¨ÓÉÓÚͼÖжÔÏó½Ï¶à£¬Ïà¶ÔÓÚÉÏÃæµÄͼ¶Ô½á¹¹×öÁËһЩ¼ò»¯µ÷Õû£©£º

Ï߳̿ØÖÆ×ۺϵ÷ÓÃ

ͼÖй²ÓÐ 5 ´¦º¬ÓжÔʼþµÄ²Ù×÷¡£ÓÉͼÖпÉÒÔ¿´³ö£¬¢ÙºÍ¢ÚÁ½´¦ÊܵÚÒ»¸ö subscribeOn() Ó°Ï죬ÔËÐÐÔÚºìÉ«Ị̈߳»¢ÛºÍ¢Ü´¦ÊܵÚÒ»¸ö observeOn() µÄÓ°Ï죬ÔËÐÐÔÚÂÌÉ«Ị̈߳»¢Ý´¦Êܵڶþ¸ö onserveOn() Ó°Ï죬ÔËÐÐÔÚ×ÏÉ«Ị̈߳»¶øµÚ¶þ¸ö subscribeOn() £¬ÓÉÓÚÔÚ֪ͨ¹ý³ÌÖÐÏ߳̾ͱ»µÚÒ»¸ö subscribeOn() ½Ø¶Ï£¬Òò´Ë¶ÔÕû¸öÁ÷³Ì²¢Ã»ÓÐÈκÎÓ°Ïì¡£ÕâÀïÒ²¾Í»Ø´ðÁËÇ°ÃæµÄÎÊÌ⣺µ±Ê¹ÓÃÁ˶à¸ö subscribeOn() µÄʱºò£¬Ö»ÓеÚÒ»¸ö subscribeOn() Æð×÷Óá£

3) ÑÓÉ죺doOnSubscribe()

È»¶ø£¬ËäÈ»³¬¹ýÒ»¸öµÄ subscribeOn() ¶Ôʼþ´¦ÀíµÄÁ÷³ÌûÓÐÓ°Ï죬µ«ÔÚÁ÷³Ì֮ǰȴÊÇ¿ÉÒÔÀûÓõġ£

ÔÚÇ°Ãæ½² Subscriber µÄʱºò£¬Ìáµ½¹ý Subscriber µÄ onStart() ¿ÉÒÔÓÃ×÷Á÷³Ì¿ªÊ¼Ç°µÄ³õʼ»¯¡£È»¶ø onStart() ÓÉÓÚÔÚ subscribe() ·¢Éúʱ¾Í±»µ÷ÓÃÁË£¬Òò´Ë²»ÄÜÖ¸¶¨Ị̈߳¬¶øÊÇÖ»ÄÜÖ´ÐÐÔÚ subscribe() ±»µ÷ÓÃʱµÄÏ̡߳£Õâ¾Íµ¼ÖÂÈç¹û onStart() Öк¬ÓжÔÏß³ÌÓÐÒªÇóµÄ´úÂ루ÀýÈçÔÚ½çÃæÉÏÏÔʾһ¸ö ProgressBar£¬Õâ±ØÐëÔÚÖ÷Ïß³ÌÖ´ÐУ©£¬½«»áÓÐÏ̷߳Ƿ¨µÄ·çÏÕ£¬ÒòΪÓÐʱÄãÎÞ·¨Ô¤²â subscribe() ½«»áÔÚʲôÏß³ÌÖ´ÐС£

¶øÓë Subscriber.onStart() Ïà¶ÔÓ¦µÄ£¬ÓÐÒ»¸ö·½·¨ Observable.doOnSubscribe() ¡£ËüºÍ Subscriber.onStart() ͬÑùÊÇÔÚ subscribe() µ÷Óúó¶øÇÒÔÚʼþ·¢ËÍǰִÐУ¬µ«Çø±ðÔÚÓÚËü¿ÉÒÔÖ¸¶¨Ï̡߳£Ä¬ÈÏÇé¿öÏ£¬ doOnSubscribe() Ö´ÐÐÔÚ subscribe() ·¢ÉúµÄỊ̈߳»¶øÈç¹ûÔÚ doOnSubscribe() Ö®ºóÓÐ subscribeOn() µÄ»°£¬Ëü½«Ö´ÐÐÔÚÀëËü×î½üµÄ subscribeOn() ËùÖ¸¶¨µÄÏ̡߳£

ʾÀý´úÂ룺

Observable.create(onSubscribe)
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Action0() {
@Override
public void call() {
progressBar.setVisibility(View.VISIBLE); // ÐèÒªÔÚÖ÷Ïß³ÌÖ´ÐÐ
}
})
.subscribeOn(AndroidSchedulers.mainThread()) // Ö¸¶¨Ö÷Ïß³Ì
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);

ÈçÉÏ£¬ÔÚ doOnSubscribe()µÄºóÃæ¸úÒ»¸ö subscribeOn() £¬¾ÍÄÜÖ¸¶¨×¼±¸¹¤×÷µÄÏß³ÌÁË¡£

RxJava µÄÊÊÓó¡¾°ºÍʹÓ÷½Ê½

1. Óë Retrofit µÄ½áºÏ

Retrofit ÊÇ Square µÄÒ»¸öÖøÃûµÄÍøÂçÇëÇó¿â¡£Ã»ÓÐÓùý Retrofit µÄ¿ÉÒÔÑ¡ÔñÌø¹ýÕâһС½ÚҲû¹ØÏµ£¬ÎÒ¾ÙµÄÿÖÖ³¡¾°¶¼Ö»ÊǸöÀý×Ó£¬¶øÇÒÀý×ÓÖ®¼ä²¢ÎÞǰºó¹ØÁª£¬Ö»ÊǸöÅ×שÒýÓñµÄ×÷Óã¬ËùÒÔÄãÌø¹ýÕâÀï¿´±ðµÄ³¡¾°Ò²¿ÉÒԵġ£

Retrofit ³ýÁËÌṩÁË´«Í³µÄ Callback ÐÎʽµÄ API£¬»¹ÓÐ RxJava °æ±¾µÄ Observable ÐÎʽ API¡£ÏÂÃæÎÒÓöԱȵķ½Ê½À´½éÉÜ Retrofit µÄ RxJava °æ API ºÍ´«Í³°æ±¾µÄÇø±ð¡£

ÒÔ»ñȡһ¸ö User ¶ÔÏóµÄ½Ó¿Ú×÷ΪÀý×Ó¡£Ê¹ÓÃRetrofit µÄ´«Í³ API£¬Äã¿ÉÒÔÓÃÕâÑùµÄ·½Ê½À´¶¨ÒåÇëÇó£º

@GET("/user")
public void getUser(@Query("userId") String userId, Callback<User> callback);

ÔÚ³ÌÐòµÄ¹¹½¨¹ý³ÌÖУ¬ Retrofit »á°Ñ×Ô¶¯°Ñ·½·¨ÊµÏÖ²¢Éú³É´úÂ룬Ȼºó¿ª·¢Õ߾ͿÉÒÔÀûÓÃÏÂÃæµÄ·½·¨À´»ñÈ¡ÌØ¶¨Óû§²¢´¦ÀíÏìÓ¦£º

getUser(userId, new Callback<User>() {
@Override
public void success(User user) {
userView.setUser(user);
}

@Override
public void failure(RetrofitError error) {
// Error handling
...
}
};

¶øÊ¹Óà RxJava ÐÎʽµÄ API£¬¶¨ÒåͬÑùµÄÇëÇóÊÇÕâÑùµÄ£º

@GET("/user")
public Observable<User> getUser(@Query("userId") String userId);

ʹÓõÄʱºòÊÇÕâÑùµÄ£º

getUser(userId)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<User>() {
@Override
public void onNext(User user) {
userView.setUser(user);
}

@Override
public void onCompleted() {
}

@Override
public void onError(Throwable error) {
// Error handling
...
}
});

¿´µ½Çø±ðÁËÂð£¿

µ± RxJava ÐÎʽµÄʱºò£¬Retrofit °ÑÇëÇó·â×°½ø Observable £¬ÔÚÇëÇó½áÊøºóµ÷Óà onNext() »òÔÚÇëÇóʧ°Üºóµ÷Óà onError()¡£

¶Ô±ÈÀ´¿´£¬ Callback ÐÎʽºÍ Observable ÐÎʽ³¤µÃ²»Ì«Ò»Ñù£¬µ«±¾Öʶ¼²î²»¶à£¬¶øÇÒÔÚϸ½ÚÉÏ Observable ÐÎÊ½ËÆºõ»¹±È Callback ÐÎʽҪ²îµã¡£ÄÇ Retrofit Ϊʲô»¹ÒªÌṩ RxJava µÄÖ§³ÖÄØ£¿

ÒòΪËüºÃÓ𡣡´ÓÕâ¸öÀý×Ó¿´²»³öÀ´ÊÇÒòΪÕâÖ»ÊÇ×î¼òµ¥µÄÇé¿ö¡£¶øÒ»µ©Çé¾°¸´ÔÓÆðÀ´£¬ Callback ÐÎʽÂíÉϾͻῪʼÈÃÈËÍ·ÌÛ¡£±ÈÈ磺

¼ÙÉèÕâôһÖÖÇé¿ö£ºÄãµÄ³ÌÐòÈ¡µ½µÄ User ²¢²»Ó¦¸ÃÖ±½ÓÏÔʾ£¬¶øÊÇÐèÒªÏÈÓëÊý¾Ý¿âÖеÄÊý¾Ý½øÐбȶԺÍÐÞÕýºóÔÙÏÔʾ¡£Ê¹Óà Callback ·½Ê½´ó¸Å¿ÉÒÔÕâôд£º

getUser(userId, new Callback<User>() {
@Override
public void success(User user) {
processUser(user); // ³¢ÊÔÐÞÕý User Êý¾Ý
userView.setUser(user);
}

@Override
public void failure(RetrofitError error) {
// Error handling
...
}
};

ÓÐÎÊÌâÂð£¿

ºÜ¼ò±ã£¬µ«²»ÒªÕâÑù×ö¡£ÎªÊ²Ã´£¿ÒòΪÕâÑù×ö»áÓ°ÏìÐÔÄÜ¡£Êý¾Ý¿âµÄ²Ù×÷ºÜÖØ£¬Ò»´Î¶Áд²Ù×÷»¨·Ñ 10~20ms ÊǺܳ£¼ûµÄ£¬ÕâÑùµÄºÄʱºÜÈÝÒ×Ôì³É½çÃæµÄ¿¨¶Ù¡£ËùÒÔͨ³£Çé¿öÏ£¬Èç¹û¿ÉÒԵĻ°Ò»¶¨Òª±ÜÃâÔÚÖ÷Ïß³ÌÖд¦ÀíÊý¾Ý¿â¡£ËùÒÔΪÁËÌáÉýÐÔÄÜ£¬Õâ¶Î´úÂë¿ÉÒÔÓÅ»¯Ò»Ï£º

!getUser(userId, new Callback<User>() {
@Override
public void success(User user) {
new Thread() {
@Override
public void run() {
processUser(user); // ³¢ÊÔÐÞÕý User Êý¾Ý
runOnUiThread(new Runnable() { // ÇÐ»Ø UI Ïß³Ì
@Override
public void run() {
userView.setUser(user);
}
});
}).start();
}

@Override
public void failure(RetrofitError error) {
// Error handling
...
}
};

ÐÔÄÜÎÊÌâ½â¾ö£¬µ«¡­¡­Õâ´úÂëʵÔÚÊÇÌ«ÂÒÁË£¬ÃÔÖ®Ëõ½ø°¡£¡ÔÓÂҵĴúÂëÍùÍù²»½ö½öÊÇÃÀ¹ÛÎÊÌ⣬ÒòΪ´úÂëÔ½ÂÒÍùÍù¾ÍÔ½ÄѶÁ¶®£¬¶øÈç¹ûÏîÄ¿Öгä³â×ÅÔÓÂҵĴúÂ룬ÎÞÒɻήµÍ´úÂëµÄ¿É¶ÁÐÔ£¬Ôì³ÉÍŶӿª·¢Ð§ÂʵĽµµÍºÍ³ö´íÂʵÄÉý¸ß¡£

Õâʱºò£¬Èç¹ûÓà RxJava µÄÐÎʽ£¬¾ÍºÃ°ì¶àÁË¡£ RxJava ÐÎʽµÄ´úÂëÊÇÕâÑùµÄ£º

getUser(userId)
.doOnNext(new Action1<User>() {
@Override
public void call(User user) {
processUser(user);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<User>() {
@Override
public void onNext(User user) {
userView.setUser(user);
}

@Override
public void onCompleted() {
}

@Override
public void onError(Throwable error) {
// Error handling
...
}
});

ºǫ́´úÂëºÍǰ̨´úÂëÈ«¶¼Ð´ÔÚÒ»ÌõÁ´ÖУ¬Ã÷ÏÔÇåÎúÁ˺ܶࡣ

ÔÙ¾ÙÒ»¸öÀý×Ó£º¼ÙÉè /user ½Ó¿Ú²¢²»ÄÜÖ±½Ó·ÃÎÊ£¬¶øÐèÒªÌîÈëÒ»¸öÔÚÏß»ñÈ¡µÄ token £¬´úÂëÓ¦¸ÃÔõôд£¿

Callback ·½Ê½£¬¿ÉÒÔʹÓÃǶÌ×µÄ Callback£º

@GET("/token")
public void getToken(Callback<String> callback);

@GET("/user")
public void getUser(@Query("token") String token, @Query("userId") String userId, Callback<User> callback);

...

getToken(new Callback<String>() {
@Override
public void success(String token) {
getUser(token, userId, new Callback<User>() {
@Override
public void success(User user) {
userView.setUser(user);
}

@Override
public void failure(RetrofitError error) {
// Error handling
...
}
};
}

@Override
public void failure(RetrofitError error) {
// Error handling
...
}
});

µ¹ÊÇûÓÐʲôÐÔÄÜÎÊÌ⣬¿ÉÊÇÃÔÖ®Ëõ½ø»ÙÒ»Éú£¬Äã¶®ÎÒÒ²¶®£¬×ö¹ý´óÏîÄ¿µÄÈËÓ¦¸Ã¸ü¶®¡£

¶øÊ¹Óà RxJava µÄ»°£¬´úÂëÊÇÕâÑùµÄ£º

@GET("/token")
public Observable<String> getToken();

@GET("/user")
public Observable<User> getUser(@Query("token") String token, @Query("userId") String userId);

...

getToken()
.flatMap(new Func1<String, Observable<User>>() {
@Override
public Observable<User> onNext(String token) {
return getUser(token, userId);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<User>() {
@Override
public void onNext(User user) {
userView.setUser(user);
}

@Override
public void onCompleted() {
}

@Override
public void onError(Throwable error) {
// Error handling
...
}
});

ÓÃÒ»¸ö flatMap() ¾Í¸ã¶¨ÁËÂß¼­£¬ÒÀÈ»ÊÇÒ»ÌõÁ´¡£¿´×žͺÜˬ£¬Êǰɣ¿

2016/03/31 ¸üУ¬¼ÓÉÏÎÒдµÄÒ»¸ö Sample ÏîÄ¿£º

rengwuxian RxJava Samples

ºÃ£¬Retrofit ²¿·Ö¾Íµ½ÕâÀï¡£

2. RxBinding

RxBinding ÊÇ Jake Wharton µÄÒ»¸ö¿ªÔ´¿â£¬ËüÌṩÁËÒ»Ì×ÔÚ Android ƽ̨ÉϵĻùÓÚ RxJava µÄ Binding API¡£Ëùν Binding£¬¾ÍÊÇÀàËÆÉèÖà OnClickListener ¡¢ÉèÖà TextWatcher ÕâÑùµÄ×¢²á°ó¶¨¶ÔÏóµÄ API¡£

¾Ù¸öÉèÖõã»÷¼àÌýµÄÀý×Ó¡£Ê¹Óà RxBinding £¬¿ÉÒÔ°Ñʼþ¼àÌýÓÃÕâÑùµÄ·½·¨À´ÉèÖãº

Button button = ...;
RxView.clickEvents(button) // ÒÔ Observable ÐÎʽÀ´·´À¡µã»÷ʼþ
.subscribe(new Action1<ViewClickEvent>() {
@Override
public void call(ViewClickEvent event) {
// Click handling
}
});

¿´ÆðÀ´³ýÁËÐÎʽ±äÁËÃ»Ê²Ã´Çø±ð£¬ÊµÖÊÉÏÒ²ÊÇÕâÑù¡£ÉõÖÁÈç¹ûÄã¿´Ò»ÏÂËüµÄÔ´Â룬Äã»á·¢ÏÖËüÁ¬ÊµÏÖ¶¼Ã»Ê²Ã´¾ªÏ²£ºËüµÄÄÚ²¿ÊÇÖ±½ÓÓÃÒ»¸ö°ü¹ü×ÅµÄ setOnClickListener() À´ÊµÏֵġ£È»¶ø£¬½ö½öÕâÒ»¸öÐÎʽµÄ¸Ä±ä£¬È´Ç¡ºÃ¾ÍÊÇ RxBinding µÄÄ¿µÄ£ºÀ©Õ¹ÐÔ¡£Í¨¹ý RxBinding °Ñµã»÷¼àÌýת»»³É Observable Ö®ºó£¬¾ÍÓÐÁ˶ÔËü½øÐÐÀ©Õ¹µÄ¿ÉÄÜ¡£À©Õ¹µÄ·½Ê½Óкܶ࣬¸ù¾ÝÐèÇó¶ø¶¨¡£Ò»¸öÀý×ÓÊÇÇ°ÃæÌáµ½¹ýµÄ throttleFirst() £¬ÓÃÓÚÈ¥¶¶¶¯£¬Ò²¾ÍÊÇÏû³ýÊÖ¶¶µ¼ÖµĿìËÙÁ¬»·µã»÷£º

RxView.clickEvents(button)
.throttleFirst(500, TimeUnit.MILLISECONDS)
.subscribe(clickAction);

Èç¹ûÏë¶Ô RxBinding Óиü¶àÁ˽⣬¿ÉÒÔÈ¥ËüµÄ GitHub ÏîÄ¿ ÏÂÃæ¿´¿´¡£

3. ¸÷ÖÖÒì²½²Ù×÷

Ç°Ãæ¾ÙµÄ Retrofit ºÍ RxBinding µÄÀý×Ó£¬ÊÇÁ½¸ö¿ÉÒÔÌṩÏÖ³ÉµÄ Observable µÄ¿â¡£¶øÈç¹ûÄãÓÐijЩÒì²½²Ù×÷ÎÞ·¨ÓÃÕâЩ¿âÀ´×Ô¶¯Éú³É Observable£¬Ò²ÍêÈ«¿ÉÒÔ×Ô¼ºÐ´¡£ÀýÈçÊý¾Ý¿âµÄ¶Áд¡¢´óͼƬµÄÔØÈë¡¢ÎļþѹËõ/½âѹµÈ¸÷ÖÖÐèÒª·ÅÔÚºǫ́¹¤×÷µÄºÄʱ²Ù×÷£¬¶¼¿ÉÒÔÓà RxJava À´ÊµÏÖ£¬ÓÐÁË֮ǰ¼¸ÕµÄÀý×Ó£¬ÕâÀïÓ¦¸Ã²»ÓÃÔÙ¾ÙÀýÁË¡£

4. RxBus

RxBus Ãû×Ö¿´ÆðÀ´ÏñÒ»¸ö¿â£¬µ«Ëü²¢²»ÊÇÒ»¸ö¿â£¬¶øÊÇÒ»ÖÖģʽ£¬ËüµÄ˼ÏëÊÇʹÓà RxJava À´ÊµÏÖÁË EventBus £¬¶øÈÃÄã²»ÔÙÐèҪʹÓà Otto »òÕß GreenRobot µÄ EventBus¡£ÖÁÓÚʲôÊÇ RxBus£¬¿ÉÒÔ¿´ÕâÆªÎÄÕ¡£Ë³±ã˵һ¾ä£¬Flipboard ÒѾ­Óà RxBus Ìæ»»µôÁË Otto £¬Ä¿Ç°ÎªÖ¹Ã»Óв»Á¼·´Ó¦¡£

×îºó

¶ÔÓÚ Android ¿ª·¢ÕßÀ´Ëµ£¬ RxJava ÊÇÒ»¸öºÜÄÑÉÏÊֵĿ⣬ÒòΪËü¶ÔÓÚ Android ¿ª·¢ÕßÀ´ËµÓÐÌ«¶àİÉúµÄ¸ÅÄîÁË¡£¿ÉÊÇËüÕæµÄºÜÅ£±Æ¡£Òò´Ë£¬ÎÒдÁËÕâÆª¡¶¸ø Android ¿ª·¢ÕßµÄ RxJava Ïê½â¡·£¬Ï£ÍûÄܸøÊ¼Öո㲻Ã÷°×ʲôÊÇ RxJava µÄÈËһЩÈëÃŵÄÖ¸Òý£¬»òÕßÄÜÈÃÕýÔÚʹÓà RxJava µ«ÈÔÈ»ÐÄ´æÒÉ»óµÄÈË¿´µ½Ò»Ð©¸üÉîÈëµÄ½âÎö¡£ÎÞÂÛÈçºÎ£¬Ö»ÒªÄܸø¸÷λͬΪ Android ¹¤³ÌʦµÄÄãÃÇÌṩһЩ°ïÖú£¬ÕâÆªÎÄÕµÄÄ¿µÄ¾Í´ïµ½ÁË¡£

   
2275 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì