我正在尝试构建一个名为请求的通用对象,它可以保存与不同实体相关的请求。
例如,可以为健身类、员工类或联系人类创建请求。下面是检查
我们是否存在任何脱机数据。
getNonSynced
函数将返回
RealmResults
未同步的数据。
我要补充一点
realmResults
进入请求类
RealmList
. 一旦创建了请求,我就使用gson将其转换为json字符串,这就是我的应用程序崩溃和抛出的地方。
Caused by: java.lang.StackOverflowError: stack size 8MB
函数获取脱机数据并分析请求
public <T extends RealmModel > void checkOfflineData(){
Realm realm = Realm.getDefaultInstance();
Set<Class<? extends RealmModel>> realmObjectClasses = realm.getConfiguration().getRealmObjectClasses();
for(Class modelClass: realmObjectClasses) {
// fetch non synced data
RealmResults realmResults = getNotSynced(realm,modelClass);
if(realmResults !=null && realmResults.size() > 0){
//build a request
Request<T> request = new Request<T>();
RealmList<T> realmList = new RealmList<T>();
//add results to list
realmList.addAll(realmResults.subList(0, realmResults.size()));
request.setRequestList(realmList);
}
}
// Parsing using GSON data
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Request.class, new RequestSerializer());
Gson gson = builder.create();
String data = gson.toJson(request);
}
请求类
public class Request<T> {
private RealmList<T> requestList;
public RealmList<T> getRequestList() {
return requestList;
}
public void setRequestList(RealmList<T> requestList) {
this.requestList = requestList;
}
}
这可能发生在GSON尝试序列化时。
RealmList<T> requestList
它可能试图找到具体的类型。我所寻求的是将类装箱并为T提供适当的类类型的方法。
误差
07-17 13:04:00.177 6076-6076/com.org.connectedhealth W/System.err: Caused by: java.lang.StackOverflowError: stack size 8MB
at java.lang.reflect.Field.get(Native Method)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.writeField(ReflectiveTypeAdapterFactory.java:138)
07-17 13:04:00.178 6076-6076/com.org.connectedhealth W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
07-17 13:04:00.179 6076-6076/com.org.connectedhealth W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
07-17 13:04:00.180 6076-6076/com.org.connectedhealth W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
我在这里尝试过一些事情,如果我显式地提供一个特定于类型的对象,那么gson不会抛出错误。
Request<T> request = new Request<T>();
RealmList<T> realmList = new RealmList<T>();
// explicitly providing fitness object
realmList.add((T)new Fitness());
request.setRequestList(realmList);
所以我想我需要探索一种返回具有特定类型的领域结果的方法。
private <T extends RealmModel> RealmResults<T> getNotSynced(Realm realm , Class<T> modelClass) {
RealmResults<T> realmResults =null;
try{
realmResults= realm.where(modelClass).equalTo("syncInfo.syncStatus", false).findAll();
}catch (Exception e){
Log.e(TAG ,"Exception "+e.getMessage());
}
return realmResults;
}