问题
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 within 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;
}
回答1:
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.
来源:https://stackoverflow.com/questions/7738486/requestfactory-slow-on-android