android - How to structure my app using MVP with rxjava and retrofit to get data out of Observables? -


so i'll try keep question to-the-point possible, involve code snippets traverse entire codepath.

for context, new , self-taught android dev, please notify me of clear misunderstandings/poor organization throughout. main focus of question bug experiencing now, that, after network request, variable supposed set result of network request null, because code moved forward before network request completed.

here activity method. supposed populate mfriends variable result of muserpresenter.getuserlist(), (unfortunately) null:

/**  * grabs list of friends, populates list useradapter  */ @override public void onresume(){     super.onresume();     muserpresenter = new userpresenter();     mfriends = muserpresenter.getuserlist();     if (mgridview.getadapter() == null) {         useradapter adapter = new useradapter(getactivity(), mfriends);         mgridview.setadapter(adapter);     }     else{         ((useradapter)mgridview.getadapter()).refill(mfriends);     }  } 

here how structuring userpresenter method getuserlist:

public list<user> getuserlist() {     apiservice.get_friends(this);     return muserlist; } 

the real magic happens in apiservice class:

public static void get_friends(final userpresenter userpresenter){     apiendpointinterface apiservice = prepareservice();     apiservice.get_friends().         observeon(androidschedulers.mainthread())         .subscribe(             new action1<list<user>>()             {                @override                public void call(list<user> users) {                   userpresenter.setlist(users);                }             }         ); } 

my thinking was, calling userpresenter.setlist(users) in apiservice, set muserlist response api request. however, instead, muserlist == null @ time getuserlist responds.

any ideas of how can structure this?

i have started learn similar. here, rather use callbacks.

in presenter,

public void setlist(list<user> users) {     yourview.setuserlist(users); } 

and activity implements view (mvp)

@override public void setuserlist(list<user> users) {     ((useradapter)mgridview.getadapter()).refill(mfriends); } 

also, check retrofit not returning null list.

i have made small app when learning this. fetches user data github , shows in list. working ormlite , picasso db stuff there. dagger dependency used (but can ignore that). here's link.

here's how presenter behaves:

private dataretrieverimpl dataretriever;  @override public void getuserlist(string name) {     dataretriever.getuserlist(name); }  @override public void onevent(dataretrieverevent event) {     userlist userlist = (userlist)event.getdata();     mainview.setitems(userlist); } 

dataretrieverimpl works module (sort of).

private dataretriever dataretriever;  restadapter = new restadapter.builder().setendpoint(server_end_point).build(); dataretriever = restadapter.create(dataretriever.class);  public void getuserlist(final string name) {     log.i(tag, "getting user list for: " + name);      observable<userlist> observable = dataretriever.getuserlist(name);      log.i(tag, "subscribe userlist");     observable.subscribe(new action1<userlist>() {         @override         public void call(userlist userlist) {              eventbus.post(new dataretrieverevent("userlist", userlist));              // save database             (user user : userlist.getitems()) {                 log.i(tag, user.getlogin());                 try {                     dbhelper.create(user);                 } catch (sqlexception e) {                     e.printstacktrace();                 }             }          }     }, new action1<throwable>() {         @override         public void call(throwable throwable) {             throwable.printstacktrace();         }     }); } 

and dataretriever interface retrofit. i'm sorry naming confusion.

public interface dataretriever {      @get("/search/users")     public observable<userlist> getuserlist(@query("q") string name);  } 

any activity,

@override public void setitems(final userlist userlist) {     runonuithread(new runnable() {         @override         public void run() {             useradapter useradapter = (useradapter)recyclerview.getadapter();             useradapter.setuserlist(userlist);             useradapter.notifyitemrangeinserted(0, useradapter.getitemcount());         }     }); } 

Comments

Popular posts from this blog

asp.net mvc - SSO between MVCForum and Umbraco7 -

Python Tkinter keyboard using bind -

ubuntu - Selenium Node Not Connecting to Hub, Not Opening Port -