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
Post a Comment