ǰÑÔ
ÎÒ´ÓÈ¥Ä꿪ʼʹÓà 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 ¹¤³ÌʦµÄÄãÃÇÌṩһЩ°ïÖú£¬ÕâÆªÎÄÕµÄÄ¿µÄ¾Í´ïµ½ÁË¡£
|