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

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -