需要回答:Android的计算器错误,而序列数据 [英] NEED ANSWER: Android stackoverflow error while serializing data
问题描述
查看编辑接听/发表评论前请先!
所以,我有以下的code我在哪里活动之间在我的AsyncTask的onPostExecute()方法来传递数据,和我的应用程序不断用计算器错误而崩溃(注:这不是我的全部活动)
So I have the following code where I am passing data between activities in the onPostExecute() method of my asynctask, and my app is constantly crashing with a stackoverflow error: (note: this is not my full activity)
public class Wrapper{
public Elements gradeList;
}
private class infoGetter extends AsyncTask<Void, Void, Wrapper> {
ProgressDialog progress;
public infoGetter(WelcomeLogin activity){
progress = new ProgressDialog(activity);
}
@Override
protected void onPreExecute() {
progress.setTitle("Logging in:");
progress.setMessage("Please wait...");
progress.show();
}
@Override
protected Wrapper doInBackground(Void... params) {
Wrapper w = new Wrapper();
String studentID = studentID2.getText().toString();
String username = user.getText().toString();
String password = pass.getText().toString();
String loginURL = "https://parents.mtsd.k12.nj.us/genesis/parents/j_security_check";
String userDataUrl = "https://parents.mtsd.k12.nj.us/genesis/parents?tab1=" + tab1 + "&tab2=" + tab2 + "&tab3=" + tab3 + "&studentid=" + studentID + "&action=" + action;
Response response = new GradeFetcher().getRequest(userDataUrl);
Document loggedInDocument = new GradeFetcher().postRequest(loginURL, username, password, studentID, response);
Elements grades = new GradeFetcher().gradeExtractor(loggedInDocument);
for(Element grade : grades) {
Log.e("Grades: ",grade.text());
}
w.gradeList = grades;
Log.e("MESSAGE: ","Going to onPostExecute");
return w;
}
protected void onPostExecute(Wrapper w) {
Log.e("MESSAGE: ", "Starting onPostExecute");
Gson gson = new Gson();
String serial = gson.toJson(w.gradeList,Elements.class);
Intent GradeList = new Intent(getApplicationContext(), MainList.class);
GradeList.putExtra("grades", serial);
startActivity(GradeList);
Log.e("MESSAGE: ", "Going to next activity now");
progress.dismiss();
}
}
和我得到了以下错误:
08-03 13:33:28.592 27871-28323/com.aurum.gradebook E/MESSAGE:﹕ Going to onPostExecute
08-03 13:33:28.604 27871-27871/com.aurum.gradebook E/MESSAGE:﹕ Starting onPostExecute
08-03 13:33:37.013 27871-27871/com.aurum.gradebook E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.aurum.gradebook, PID: 27871
java.lang.StackOverflowError: stack size 8MB
at java.io.StringWriter.write(StringWriter.java:147)
at com.google.gson.stream.JsonWriter.string(JsonWriter.java:534)
at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:402)
at com.google.gson.stream.JsonWriter.value(JsonWriter.java:417)
at com.google.gson.internal.bind.TypeAdapters$13.write(TypeAdapters.java:362)
at com.google.gson.internal.bind.TypeAdapters$13.write(TypeAdapters.java:346)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
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:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRun timeTypeWrapper.java:68)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterF
我找不到在哪里/是什么原因造成这种情况发生。请帮帮忙!
I can't find where/what is causing this to occur. Please help!
修改1:我现在知道,我的错误在于语句:
EDIT 1: I now know that my error lies in the statement :
String serial = gson.toJson(w.gradeList,Elements.class);
我以为我的意思w.gradeList太大。但是,这是包含约6报废等级(例如100%)的简单Jsoup元素的对象,所以我不认为这可怎么是这样的。据我所知,这个错误是最有可能的原因是循环引用,但我无法找到其中,这会发生的任何地方。(我也不想诉诸使用临时文件或以外的任何其他意图通过我的数据,因为他们应该完全有能力这样做的)
推荐答案
根据我的经验,你能够把数据高达1MB的包里面的意向。虽然它没有记录,有一个问题,在Android的AOSP开放。 问题URL: HTTPS://$c$c.google。 COM / P /安卓/问题/详细信息?ID = 5878
From my experience, you are able to put up to 1MB of data in a Bundle inside Intent. Though it is not documented, there is a issue open in android aosp. issue url: https://code.google.com/p/android/issues/detail?id=5878
您最初的问题出在字符串串行= gson.toJson(w.gradeList,Elements.class);
即使你成功克服这个这个错误,你将面对在最难的挑战GradeList.putExtra(等级,串行);
在这里你的系列
太大携带和显然这是 8MB
[通过了解堆栈跟踪。
your initial problem lies in String serial = gson.toJson(w.gradeList,Elements.class);
Even if you succeed to overcome this this error, you will face the hardest challenge in GradeList.putExtra("grades", serial);
here your serial
is too big to carry and apparently it is 8MB
[by understanding the stack trace].
如何解决此限制:
正如你显然无法跨越这个限制,你可以现在就做什么。写的内容到一个存储。我不知道你是否可以这样写的数据需要共享preference(我相信这是可以做到),但你可以做写在一个临时文件,然后将该文件发送到URI的活动。你又来从文件中读取。 我希望这可以帮助你。
As you clearly can't cross this limit, what you can do now. write the content to a storage. I am not sure whether you can write this amount of data to SharedPreference (I believe it can be done) but you can do write in a temporary file and then send the file uri to the activity. There you read again from the file. I hope this helps you.
这篇关于需要回答:Android的计算器错误,而序列数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!