RequestFactory slow on Android
I am using RequestFactory with appengine and android. It has been working great, however when I retrieve a list of objects of any size(around 400) it has a very delayed response. It appears that the transfer of data happens fairly quickly(~4 secs), however I do not get the onSuccess() callback until much later(1-2 mins or greater). I am guessing this could be slow performance of parsing withi开发者_开发百科n requestfactory. My objects are just POJOs with about 10 fields of text and longs.
My question is has anyone come across this? Anyone have a more efficient way to get lots of data off of appengine quickly in android?
UPDATE: I also have ran into outofmemoryerrors when using RF with lots of entities(3000+). I switched to straight json using the GSON lib and parsing was quicker and have not ran into memory problems yet.
The specific Entity I am sending over the wire is below(I am using Objectify).
@Cached
@Entity
public class InterestPoint
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long groupId;
private String more, data;
@Unindexed
private int lat, longi;
@Unindexed
private String address, city, state;
@Unindexed
private int num1, num2, num3;
@Unindexed
private int num4,num5,num6;
@Unindexed
private String name;
@Unindexed
private int moreData;
@Unindexed
private String notes;
}
Adding to the author's description of the problem
We're retrieving 8 relatively small objects and each has one to four child objects which are tiny:
Here's an example of the stack after the response has been returned from the server, for over a minute it's in the org.json package or com.google.web.bindery and we have high cpu usage:
java.lang.AbstractStringBuilder append0 AbstractStringBuilder.java 143 false
java.lang.StringBuilder append StringBuilder.java 125 false
org.json.JSONStringer string JSONStringer.java 344 false
org.json.JSONStringer value JSONStringer.java 252 false
org.json.JSONObject quote JSONObject.java 713 false
com.google.web.bindery.autobean.shared.impl.StringQuoter quote StringQuoter.java 69 false
com.google.web.bindery.autobean.shared.impl.StringQuoter create StringQuoter.java 50 false
com.google.web.bindery.autobean.shared.ValueCodex$Type$13 encode ValueCodex.java 193 false
com.google.web.bindery.autobean.shared.ValueCodex encode ValueCodex.java 315 false
com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl$ValueCoder extractSplittable AutoBeanCodexImpl.java 500 false
com.google.web.bindery.autobean.shared.impl.AbstractAutoBean setProperty AbstractAutoBean.java 277 false
com.google.web.bindery.autobean.vm.impl.ProxyAutoBean setProperty ProxyAutoBean.java 253 false
com.google.web.bindery.autobean.vm.impl.BeanPropertyContext set BeanPropertyContext.java 44 false
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext$3 visitValueProperty AbstractRequestContext.java 910 false
com.google.web.bindery.autobean.vm.impl.ProxyAutoBean traverseProperties ProxyAutoBean.java 289 false
com.google.web.bindery.autobean.shared.impl.AbstractAutoBean traverse AbstractAutoBean.java 166 false
com.google.web.bindery.autobean.shared.impl.AbstractAutoBean accept AbstractAutoBean.java 101 false
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext processReturnOperation AbstractRequestContext.java 879 false
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext processReturnOperations AbstractRequestContext.java 1215 false
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext access$600 AbstractRequestContext.java 76 false
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext$StandardPayloadDialect processPayload AbstractRequestContext.java 347 false
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext$5 onTransportSuccess AbstractRequestContext.java 1108 false
com.whichfestival.AndroidRequestTransport send AndroidRequestTransport.java 68 false
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext doFire AbstractRequestContext.java 1102 false
com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext fire AbstractRequestContext.java 569 false
com.google.web.bindery.requestfactory.shared.impl.AbstractRequest fire AbstractRequest.java 54 false
com.google.web.bindery.requestfactory.shared.impl.AbstractRequest fire AbstractRequest.java 59 false
com.whichfestival.FetchTopService getEvents FetchTopService.java 99 false
com.whichfestival.FetchTopService onHandleIntent FetchTopService.java 56 false
android.app.IntentService$ServiceHandler handleMessage IntentService.java 59 false
android.os.Handler dispatchMessage Handler.java 99 false
android.os.Looper loop Looper.java 130 false
android.os.HandlerThread run HandlerThread.java 60 false
And we see the GC kick in about 25 times:
11-16 22:30:28.464: D/dalvikvm(416): GC_CONCURRENT freed 930K, 51% free 3321K/6727K, external 1654K/2137K, paused 15ms+10ms
11-16 22:30:33.605: D/dalvikvm(416): GC_CONCURRENT freed 515K, 49% free 3452K/6727K, external 1654K/2137K, paused 10ms+13ms
11-16 22:30:37.554: D/dalvikvm(416): GC_CONCURRENT freed 638K, 49% free 3497K/6727K, external 1654K/2137K, paused 11ms+10ms
11-16 22:30:43.424: D/dalvikvm(416): GC_CONCURRENT freed 681K, 47% free 3572K/6727K, external 1654K/2137K, paused 6ms+9ms
all for about 15 small pojos... would appreciate any help. Absolutely desperate to solve this.
精彩评论