android - How to continue Subscribed to observable even after onError called -
i'm newbie rxjava , learning through samples. have done sample rxjava retrofit app show details of movies http://www.omdbapi.com. app has searchbox using user inputs movie name, fetched , sent api request, , upon response, result shown. issue whenever error occur, after onerror, edittext observable doesn't emit anymore. so, if 1 movie search fails due api error, need close , re-launch app in order continue movie search. how can observe edittext changes after onerror? below code:
public class mainactivity extends appcompatactivity implements searchview.onquerytextlistener { private static final string tag = "log"; @inject apiinterface mapiinterface; private mainactivityviewhelper mmainactivityviewhelper; behaviorsubject<string> mstringsubject = behaviorsubject.create(); private viewmodel mvm; private observer<moviedata> mmoviedataobserver; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); //setting views / databining , dagger mvm = new viewmodel(); activitymainbinding binding = databindingutil.setcontentview(this, r.layout.activity_main); binding.setvm(mvm); app.get(this).getappcomponent().inject(this); mmainactivityviewhelper = new mainactivityviewhelper(); mmainactivityviewhelper.setsearchtoolbar(this, this); searchsubscription().subscribe(mmoviedataobserver); } private observable<moviedata> searchsubscription() { mmoviedataobserver = new observer<moviedata>() { @override public void onsubscribe(@nonnull disposable d) { log.d(tag, "onsubscribe: "); } @override public void onnext(@nonnull moviedata moviedata) { log.d(tag, "onnext: " + moviedata); mvm.loading.set(false); mvm.moviedata.set(moviedata); } @override public void onerror(@nonnull throwable e) { log.d(tag, "onerror: " + e.getmessage()); searchsubscription(); } @override public void oncomplete() { log.d(tag, "oncomplete: "); } }; observable<moviedata> moviedataobservable = mstringsubject .filter(s -> s != null) .doonnext(s -> log.d(tag, s)) .debounce(500, timeunit.milliseconds) .doonnext(s -> log.d(tag, "oncreate: " + s)) .flatmap(s -> mapiinterface.getmovie(s)) .onerrorreturn(throwable -> null) .doonsubscribe(disposable -> mvm.loading.set(true)) .dofinally(() -> mvm.loading.set(false)) .subscribeon(schedulers.computation()) .observeon(androidschedulers.mainthread()); return moviedataobservable; } @override public boolean oncreateoptionsmenu(final menu menu) { getmenuinflater().inflate(r.menu.menu_home, menu); return true; } @override public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case r.id.action_search: if (build.version.sdk_int >= build.version_codes.lollipop) anim.circlereveal(this, r.id.searchtoolbar, 1, true, true); else mmainactivityviewhelper.msearchtoolbar.setvisibility(view.visible); mmainactivityviewhelper.mitem.expandactionview(); return true; default: return super.onoptionsitemselected(item); } } @override public boolean onquerytextsubmit(string query) { return true; } @override public boolean onquerytextchange(string newtext) { mstringsubject.onnext(newtext); return true; } }
here , when error occurs in retrofit observable, error continues main observable, , stream stops. can skip error retrofit observable pass main stream. make use of error handling operators specified here how ignore error , continue infinite stream?
try apply error handling retrofit observable , returning flatmap
for example
observable<moviedata> moviedataobservable = mstringsubject .filter(s -> s != null) .doonnext(s -> log.d(tag, s)) .debounce(500, timeunit.milliseconds) .doonnext(s -> log.d(tag, "oncreate: " + s)) .flatmap(s -> mapiinterface.getmovie(s).onerrorreturn(throwable -> new moviedata())) .doonsubscribe(disposable -> mvm.loading.set(true)) .dofinally(() -> mvm.loading.set(false)) .subscribeon(schedulers.computation()) .observeon(androidschedulers.mainthread());
here , on error , retrofit observable return empty moviedata
object instead of calling onerror
. check empty moviedata
object error case , handle accordingly
Comments
Post a Comment