【发布时间】:2017-06-19 19:46:06
【问题描述】:
我正在使用 Retrofit 和 Gson 将自定义对象列表上传到服务器。我这样做没有任何问题:在 Mororola、Asus 和许多其他设备上进行了测试。从来没有问题!现在我正在使用 Zebra 智能手机,一款工业智能手机,我的应用程序在创建 JSON 期间几乎总是崩溃(我已经记录了该应用程序在崩溃之前正在编写 JSON)。我正在使用TypeAdapters 检查数据,所以它不应该是数据值的问题。这是日志:
D/dalvikvm: JIT unchain all for threadid=13
W/dalvikvm: threadid=15: spin on suspend #1 threadid=13 (pcf=0)
W/dalvikvm: threadid=15: spin on suspend #2 threadid=13 (pcf=0)
I/dalvikvm: "Retrofit-Idle" prio=5 tid=15 RUNNABLE JIT
I/dalvikvm: | group="main" sCount=0 dsCount=0 obj=0x41d52cc8 self=0x6065ec38
I/dalvikvm: | sysTid=14452 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1599766536
I/dalvikvm: | state=R schedstat=( 0 0 0 ) utm=9 stm=2 core=0
I/dalvikvm: at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:~94)
I/dalvikvm: at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)
I/dalvikvm: at java.lang.StringBuffer.append(StringBuffer.java:219)
I/dalvikvm: at java.io.StringWriter.write(StringWriter.java:167)
I/dalvikvm: at com.google.gson.stream.JsonWriter.string(JsonWriter.java:570)
I/dalvikvm: at com.google.gson.stream.JsonWriter.value(JsonWriter.java:419)
I/dalvikvm: at my.company.app.rest.RestClient$1.write(RestClient.java:197)
I/dalvikvm: at my.company.app.rest.RestClient$1.write(RestClient.java:165)
I/dalvikvm: at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
I/dalvikvm: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113)
I/dalvikvm: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240)
I/dalvikvm: at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:107)
I/dalvikvm: at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
I/dalvikvm: at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
I/dalvikvm: at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
I/dalvikvm: at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
I/dalvikvm: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:113)
I/dalvikvm: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240)
I/dalvikvm: at com.google.gson.Gson.toJson(Gson.java:605)
I/dalvikvm: at com.google.gson.Gson.toJson(Gson.java:584)
I/dalvikvm: at com.google.gson.Gson.toJson(Gson.java:539)
I/dalvikvm: at com.google.gson.Gson.toJson(Gson.java:519)
I/dalvikvm: at retrofit.converter.GsonConverter.toBody(GsonConverter.java:80)
I/dalvikvm: at retrofit.RequestBuilder.setArguments(RequestBuilder.java:375)
I/dalvikvm: at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:298)
I/dalvikvm: at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
I/dalvikvm: at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
I/dalvikvm: at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
I/dalvikvm: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
I/dalvikvm: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
I/dalvikvm: at retrofit.Platform$Android$2$1.run(Platform.java:142)
I/dalvikvm: at java.lang.Thread.run(Thread.java:841)
我研究了几天,但没有得到具体结果:可能是内存问题吗?(我用内存较少的旧设备测试了该应用程序,但没有出现问题。) p>
非常感谢!
更新
可以是达尔维克吗?我上传了一个对象列表,将其拆分为多个 json 并使用 while(boolean) 发布调用以等待传输完成,然后再进行下一个。在网上查看我发现供应商修改的 dalvik 可能是“杀手”,不让线程在循环中等待.....看这个答案https://stackoverflow.com/a/20804679/2306946
【问题讨论】:
-
一个简单的问题:你为什么使用
StringWriter? -
你启用了proguard吗?
-
@Lyubomyr : gson 库使用它;
-
@Mike:不,我没有使用 proguard
-
是的,我认为它是修改后的 dalvik 问题,或者手机可能已植根?
标签: java android json gson retrofit