android - Retrofit2 Tail Recursion Using RxJava / RxAndroid -


i trying hang of using retrofit rxjava / rxandroid. i've done using normal retrofit2 callback method in previous app without use of reactive programming , worked fine. so, here it. need tail recall function meant fetch local government server. api uses pagination (i have construct url ?page=1, perpage=2). i've till i've whole data. so, below rx code

    public static observable<lgalistresponse> getpages(context acontext) {     string token = prefutils.gettoken(acontext);     behaviorsubject<integer> pagecontrol = behaviorsubject.<integer>create(1);     observable<lgalistresponse> ret2 = pagecontrol.asobservable().concatmap(integer -> {         if (integer > 0) {             log.e(tag, "integer: " + integer);             return servicegenerator.createservice(apiservice.class, token)                     .getlgas(string.valueof(integer), string.valueof(21))                     .doonnext(lgalistresponse -> {                         if (lgalistresponse.getmeta().getpage() != lgalistresponse.getmeta().getpagecount()) {                             pagecontrol.onnext(initialpage + 1);                         } else {                             pagecontrol.onnext(-1);                         }                     });         } else {             return observable.<lgalistresponse>empty().dooncompleted(pagecontrol::oncompleted);         }     });      return observable.defer(() -> ret2); } 

and servicegenerator class

    public class servicegenerator {          private static final string tag = "servicegen";         private static okhttpclient.builder builder = new okhttpclient.builder();          private static retrofit.builder retrofitbuilder =                 new retrofit.builder()                         .baseurl(buildconfig.host)                         .addcalladapterfactory(rxjavacalladapterfactory.createwithscheduler(schedulers.io()))                         .addconverterfactory(gsonconverterfactory.create(customgsonparser.returncustomparser()));          public static <s> s createservice(class<s> serviceclass, string token) {              builder.addinterceptor(new httplogginginterceptor().setlevel(httplogginginterceptor.level.body));             /*builder.addnetworkinterceptor(new stethointerceptor());*/             builder.connecttimeout(30000, timeunit.seconds);             builder.readtimeout(30000, timeunit.seconds);             if (token != null) {                 interceptor interceptor = chain -> {                     request newrequest = chain.request().newbuilder()                             .addheader("x-mobile", "true")                             .addheader("authorization", "bearer " + token).build();                     return chain.proceed(newrequest);                 };                 builder.addinterceptor(interceptor);             }             okhttpclient client = builder.build();              retrofit retrofit = retrofitbuilder.client(client).build();             log.e(tag, retrofit.baseurl().tostring());             return retrofit.create(serviceclass);         }          public static retrofit retrofit() {             okhttpclient client = builder.build();             return retrofitbuilder.client(client).build();         }          public static class customgsonparser {              public static gson returncustomparser(){                 return new gsonbuilder()                         .setexclusionstrategies(new exclusionstrategy() {                             @override                             public boolean shouldskipfield(fieldattributes f) {                                 return f.getdeclaringclass().equals(realmobject.class);                             }                              @override                             public boolean shouldskipclass(class<?> clazz) {                                 return false;                             }                         })                         .create();             }         }     } 

so, noticed on first call, response, on second one, 440error thrown. url formed, request throws 400error. don't know why it's throwing 400 working fine if use postman test. and, tested old code too. log long, put in pastebin logs thanks. i've written of app rxandroid / rxjava. thanks

i suggest simplify things (and remove recursion). first build pages using like

public static observable<lgalistresponse> getpages(context acontext, int initialpage, int perpage) {       string token = prefutils.gettoken(acontext);     behaviorsubject<integer> pagecontrol = behaviorsubject.<integer>create(initialpage);     observable<lgalistresponse> ret2 = pagecontrol.asobservable().concatmap(         new func1<integer,observable<lgalistresponse>>() {             observable<lgalistresponse> call(integer pagenumber) {                 if (pagenumber > 0) {                     return servicegenerator.createservice(apiservice.class, token)                                            .getlgas(string.valueof(akey), string.valueof(perpage))                                            .doonnext(                                                 new action1<lgalistresponse>() {                                                     void call(lgalistresponse page) {                                                         if (page.getmeta().getpage() != page.getmeta().getpagecount()) {                                                             pagecontrol.onnext(page.getmeta().getnextpage());                                                         } else {                                                             pagecontrol.onnext(-1);                                                         }                                                              }                                                 }                                             );                 }                                                                else {                     return observable.<lgalistresponse>empty().dooncompleted(()->pagecontrol.oncompleted());                 }                        }         }     );      return observable.defer(                 new func0<observable<lgalistresponse>() {                     observable<lgalistresponse> call() {                         return ret2;                     }                 }             );             } 

then subscribe resulting observable. looks horrible because i've avoided using lambdas should work.


Comments