Reputation: 39
While structuring my app in MVP Structure I had faced one problem, when I call the web services using Retrofit in response on success I pass the whole data into the json String so it will provoked me to do this.
My Log Cat:
FATAL EXCEPTION: main java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:147)
at java.lang.StringBuffer.append(StringBuffer.java:219)
at java.io.StringWriter.write(StringWriter.java:147)
at java.io.StringWriter.append(StringWriter.java:199)
at java.io.StringWriter.append(StringWriter.java:30)
at com.google.gson.stream.JsonWriter.beforeValue(JsonWriter.java:651)
at com.google.gson.stream.JsonWriter.open(JsonWriter.java:325)
at com.google.gson.stream.JsonWriter.beginObject(JsonWriter.java:308)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:205)
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:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:107)
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:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:107)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
Here is my Retrofit API call:
//API Call for Pitch
public void pitch() {
services
.getAPI()
.pitchList()
.enqueue(new Callback<PitchList_Res>() {
@Override
public void onResponse(Call<PitchList_Res> call, Response<PitchList_Res> response) {
if (!response.body().getdATA().isEmpty()) {
Gson gson1=new Gson();
String json = gson1.toJson(response);
mListener.pitch(json);
}
}
@Override
public void onFailure(Call<PitchList_Res> call, Throwable t) {
call.cancel();
Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show();
}
});
}
Here is the Main Activity where I'm getting the response:
//Response of Pitch
@Override
public void pitch(String response_pitch) {
editor.putString(Preference_Data.PITCH_RESPONSE, response_pitch);
editor.commit();
PitchList_Res pitchList_res = gson.fromJson(response_pitch, PitchList_Res.class);
pitchlist.addAll(pitchList_res.getdATA());
for (int i = 0; i < pitchlist.size(); i++) {
View pitchview = getLayoutInflater().inflate(
R.layout.textviewlayout, null);
final TextView tvtitle = (TextView) pitchview
.findViewById(R.id.tv_title);
String id = pitchlist.get(i).getpITCHTYPEID().toString();
tvtitle.setId(Integer.valueOf(id));
tvtitle.setText(pitchlist.get(0).getpITCHSHORT().toString());
tvtitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (stPitchSelectionID != -1) {
findViewById(stPitchSelectionID)
.setBackgroundResource(
R.drawable.btn_bg);
}
if (stPitchSelectionID == v.getId()) {
stPitchSelectionID = -1;
tvtitle.setBackgroundResource(R.drawable.btn_bg);
pitchid = "0";
} else {
stPitchSelectionID = v.getId();
tvtitle.setBackgroundResource(R.drawable.btn_bg_select);
pitchid = String.valueOf(stPitchSelectionID)
.substring(1);
}
}
});
}
}
And from Setdefaultvalue() I am checking my response from activity:
public void Setdefaultvalue() {
llpitchcontainer.removeAllViews();
llbatresultcontainer.removeAllViews();
llpitchresultcontainer.removeAllViews();
llscoringcontainer.removeAllViews();
etspeed.setText(65 + "");
tvhh.setBackgroundResource(R.drawable.no_toggle);
String response_pitch=pref.getString(Preference_Data.PITCH_RESPONSE,"");
if (response_pitch.equalsIgnoreCase("")) {
mainScoutPresenter.pitch();
Log.e("Pitch_if","Pitch_if");
} else {
pitch(response_pitch);
Log.e("Pitch_else", "Pitch_else");
}
}
Here is my two Model Class:(PitchList_Res)
public class PitchList_Res implements Serializable {
@SerializedName("DATA")
@Expose
private List<PitchList_Data> dATA = null;
public List<PitchList_Data> getdATA() {
return dATA;
}
public void setdATA(List<PitchList_Data> dATA) {
this.dATA = dATA;
}
}
PitchList_Data.java
public class PitchList_Data implements Serializable {
@SerializedName("PITCHTYPEID")
@Expose
private Integer pITCHTYPEID;
@SerializedName("PITCHFULL")
@Expose
private String pITCHFULL;
@SerializedName("PITCHSHORT")
@Expose
private String pITCHSHORT;
public Integer getpITCHTYPEID() {
return pITCHTYPEID;
}
public void setpITCHTYPEID(Integer pITCHTYPEID) {
this.pITCHTYPEID = pITCHTYPEID;
}
public String getpITCHFULL() {
return pITCHFULL;
}
public void setpITCHFULL(String pITCHFULL) {
this.pITCHFULL = pITCHFULL;
}
public String getpITCHSHORT() {
return pITCHSHORT;
}
public void setpITCHSHORT(String pITCHSHORT) {
this.pITCHSHORT = pITCHSHORT;
}
}
Upvotes: 4
Views: 3168
Reputation: 151
I was getting the same problem & found that error is due to the variables in the class of type Object.
I was parsing a java class object that contains inner objects some of which contains variable of type Object. Due to which Gson library was unable to parse that data.
I have removed Object type declaration for the variables and problem got resolved.
I think Gson library is unable to parse the java object to json if java object contains some variable that is of generic type(like Object Type in my case).
public class HatchRetailer {
private int id;
private String name;
private String purchaseLink;
private String purchaseLinkDirect;
private String logo;
private String currency;
private double price;
private String stockInfo;
private int stockCount;
private String sourceDate;
private String businessId;
// As per my understanding Gson library is not able to parse variable of type Object
// private Object marketFocus;
// private Object group;
// Setters & Getters
}
Upvotes: 2