需要回答:Android的计算器错误,而序列数据 [英] NEED ANSWER: Android stackoverflow error while serializing data

查看:412
本文介绍了需要回答:Android的计算器错误,而序列数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

查看编辑接听/发表评论前请先!

所以,我有以下的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆