android - In Fragment using web service call, how to eliminate delay to display GridView list -


i built fragment use data in web service call display gridview list. has .5 second of delay grab data , display gridview on xml. issue everytime come other pages or reorient view, delay happens. don't know missing should system save last view in memory display before gets real data web service whenever come other pages?

public class fragment_grid_room extends fragment{      private static final string tag = fragment_grid_room.class.getname();      public fragment_grid_room() {     }      @override     public void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         // add line in order fragment handle menu events.         setretaininstance(true);         sethasoptionsmenu(true);     }       @override     public view oncreateview(layoutinflater inflater, viewgroup container,                              bundle savedinstancestate) {          //start async task display rooms          displaygridrooms gridrooms = new displaygridrooms();         gridrooms.execute(new string[] { "params" });          view rootview = inflater.inflate(r.layout.fragment_roomgrid, container, false);          //rootview.findviewbyid(r.id.loadingpanel).setvisibility(view.visible);          //add current date         textview daytv = (textview) rootview.findviewbyid(r.id.currentdate);         simpledateformat sdf = new simpledateformat("eee, mmm d, yyyy");         date = new date();         string strdate = sdf.format(now);         log.d(tag, "*****strdate"+strdate);         daytv.settext(strdate);          return rootview;      }          //async task display rooms     private class displaygridrooms extends asynctask<string, void, jsonarray> {         jsonarray jsonarrayrooms;          @override         protected jsonarray doinbackground(string... url) {             string email = getresources().getstring(r.string.temp_login);             string pwd = getresources().getstring(r.string.temp_pwd);             string username = "apark@anexinet.com";             webserviceroom wsroom = new webserviceroom();             jsonarrayrooms = wsroom.getroomlist(email, pwd, username);             //system.out.println("222******returning jsonroom with: "+jsonroom.length());             return jsonarrayrooms;         }          @override         protected void onpostexecute(jsonarray jsonarrayrooms) {              arraylist<roomgrid> room_list = new arraylist<roomgrid>();             int totalnumrooms=jsonarrayrooms.length();             int availnum=0;             (int = 0; < jsonarrayrooms.length(); i++) {                 roomgrid roomobject = new roomgrid();                 try {                     jsonobject jsonroom = jsonarrayrooms.getjsonobject(i);                     string[] temp = jsonroom.getstring("roomname").split("-");                     string[] temp2 = temp[1].split("\\(");                     roomobject.setroomname(temp2[0].trim());                     string roomstat = jsonroom.getstring("statustext");                     roomobject.setstatus(roomstat);                     room_list.add(roomobject);                      if(roomstat.tolowercase().contains("available")){ //count available rooms                         availnum+=1;                     };                  } catch (exception ex) {                     log.e(tag, "json array exception rooms:" + ex);                 }             }              final gridview gridview = (gridview) getactivity().findviewbyid(r.id.gridview_room);              //set availability bar             textview avalbar = (textview) getactivity().findviewbyid(r.id.availablebar);             string availbilitytext = "available "+availnum+" of "+totalnumrooms;             avalbar.settext(availbilitytext);              window window = getactivity().getwindow();             view v = window.getdecorview();             imagebutton imagegrid = (imagebutton) v.findviewbyid(r.id.gridbutton);             imagegrid.setvisibility(view.gone);              display display = getactivity().getwindowmanager().getdefaultdisplay();             point size = new point();             display.getsize(size);             int width = size.x;             int height = size.y;             int numcolfinal = 1;             if (width > 350) {                 double numcol = width / 350;                 numcolfinal = (int) numcol;             }             gridview.setnumcolumns(numcolfinal);             log.d(tag, "screen width, numcolfinal=" + width + "," + numcolfinal);             //  getactivity().findviewbyid(r.id.loadingpanel).setvisibility(view.gone);             gridview.setadapter(new customadaptorroomgrid(getactivity(), room_list));              //when list clicked, move detail page             gridview.setonitemclicklistener(new adapterview.onitemclicklistener() {                  @override                 public void onitemclick(adapterview<?> adapterview, view view, int position, long l) {                     object o = gridview.getitematposition(position);                     roomgrid fullobject = (roomgrid)o;                     string roomname = fullobject.getroomname();                     intent intent = new intent(getactivity(), roomtimeslotactivity.class)                             .putextra(intent.extra_text, roomname);                     startactivity(intent);                 }               });          }      }   } 

one way fix issue storing data in shared preferences every time close fragment.

first little improvement. can move code below onpostexecute() in doinbackground(). , rather return jsonarray in onpostexecute() can return list of roomgrid

list<roomgrid> room_list = new arraylist<roomgrid>(); int totalnumrooms=jsonarrayrooms.length(); int availnum=0; (int = 0; < jsonarrayrooms.length(); i++) {     roomgrid roomobject = new roomgrid();     try {         jsonobject jsonroom = jsonarrayrooms.getjsonobject(i);         string[] temp = jsonroom.getstring("roomname").split("-");         string[] temp2 = temp[1].split("\\(");         roomobject.setroomname(temp2[0].trim());         string roomstat = jsonroom.getstring("statustext");         roomobject.setstatus(roomstat);         room_list.add(roomobject);         if(roomstat.tolowercase().contains("available")){              //count available rooms             availnum+=1;         };     }      catch (exception ex) {         log.e(tag, "json array exception rooms:" + ex);     } } 

in class roomgrid (the 1 add in list), add

  • method tojson() - creates jsonobjectinstance representing data
  • static method public static roomgrid from(jsonobject json) - create , return roomgrid instance (or null if json null, empty, etc)

in customadaptorroomgrid add - getitems() return list of roomgrid supplied when creating adapter

in fragment ondestroyview() add:

customadaptorroomgrid adapter = (customadaptorroomgrid) gridview.getadapter(); int length = adapter != null && adapter.getitems() != null ? adapter.getitems().size() : 0;  if (length > 0) {     // create jsonarray list     jsonarray array = new jsonarray();     (roomgrid item : adapter.getitems()) {         array.put(item.tojson();     }      // add value in preferences     sharedpreferences prefs = ...;     prefs.edit().put("your_key", array.tostring()).apply(); } 

and in fragment onviewcreated() check array shared preferences , revert list of items , supply them adapter.

then engage task download , refresh whatever need.


Comments