简体   繁体   English

在AsyncTask中使用Gson编写/读取JSON时发生android.os.TransactionTooLargeException

[英]android.os.TransactionTooLargeException occurs when Writing/Reading JSON with Gson in AsyncTask

In my App, I save E-Mails with GSON to an .json File. 在我的应用程序中,我将带有GSON的电子邮件保存到.json文件中。 Because of freezing the UI, I've to do this in Background. 由于冻结UI,我将在后台执行此操作。 I tried with a "new Thread" but I got a Parsing-Error of Gson, so I'm trying with AsyncTask now... 我尝试了一个“新线程”,但我得到了Gson的解析错误,所以我现在正在尝试使用AsyncTask ...

There my logcat puts out this: 我的logcat在这里提出了这一点:

03-12 14:36:34.750 30486-30504/at.guger.email I/art: Background sticky concurrent mark sweep GC freed 274498(12MB) AllocSpace objects, 0(0B) LOS objects, 27% free, 21MB/29MB, paused 5.096ms total 69.641ms 03-12 14:36:35.281 30486-30504/at.guger.email I/art: Background sticky concurrent mark sweep GC freed 170008(7MB) AllocSpace objects, 0(0B) LOS objects, 25% free, 21MB/29MB, paused 5.615ms total 54.870ms 03-12 14:36:35.741 30486-30504/at.guger.email I/art: Background sticky concurrent mark sweep GC freed 157620(6MB) AllocSpace objects, 0(0B) LOS objects, 24% free, 22MB/29MB, paused 5.676ms total 59.539ms 03-12 14:36:36.212 30486-30504/at.guger.email I/art: Background partial concurrent mark sweep GC freed 151786(6MB) AllocSpace objects, 0(0B) LOS objects, 40% free, 22MB/38MB, paused 9.185ms total 107.879ms 03-12 03-12-12:36:34.750 30486-30504 / at.guger.email I / art:背景粘性并发标记清除GC已释放274498(12MB)AllocSpace对象,0(0B)LOS对象,27%可用空间,21MB / 29MB,暂停5.096毫秒总计69.641毫秒03-12 14:36:35.281 30486-30504 / at.guger.email I / art:背景粘性并发标记清除GC已释放170008(7MB)AllocSpace对象,0(0B)LOS对象,25%免费,21MB / 29MB,暂停5.615ms总计54.870ms 03-12 14:36:35.741 30486-30504 / at.guger.email I / art:后台粘性并发标记扫描GC释放157620(6MB)AllocSpace对象,0(0B )LOS对象,24%空闲,22MB / 29MB,暂停5.676ms,总计59.539ms 03-12 14:36:36.212 30486-30504 / at.guger.email I / art:后台部分并发标记清除GC已释放151786(6MB) AllocSpace对象,0(0B)LOS对象,40%免费,22MB / 38MB,暂停9.185ms总计107.879ms 03-12

14:36:37.193 30486-30504/at.guger.email I/art: Background sticky concurrent mark sweep GC freed 355102(14MB) AllocSpace objects, 0(0B) LOS objects, 24% free, 24MB/32MB, paused 12.054ms total 130.218ms 14:36:37.193 30486-30504 / at.guger.email I / art:后台粘滞并发标记扫描GC释放355102(14MB)AllocSpace对象,0(0B)LOS对象,24%免费,24MB / 32MB,暂停12.054ms总计130.218ms

03-12 14:36:37.753 30486-30504/at.guger.email I/art: Background sticky concurrent mark sweep GC freed 181500(6MB) AllocSpace objects, 97(1195KB) LOS objects, 23% free, 24MB/32MB, paused 8.087ms total 105.010ms 03/12/14:36:37.753 30486-30504 / at.guger.email I / art:背景粘性并发标记清除GC已释放181500(6MB)AllocSpace对象,97(1195KB)LOS对象,23%空闲,24MB / 32MB,暂停8.087ms总计105.010ms

This is repeated for maybe 100 times.. 可能会重复100次。

Then this is put out: 然后这是推出:

03-12 14:37:02.858 30486-31452/at.guger.email E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3 Process: at.guger.email, PID: 30486 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:304) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.StackOverflowError: stack size 1036KB at com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:111) at com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:553) at com.google.gson.internal.$Gson$Types.canonicalize( 03-12 14:37:02.858 30486-31452 / at.guger.email E / AndroidRuntime:FATAL EXCEPTION:AsyncTask#3进程:at.guger.email,PID:30486 java.lang.RuntimeException:执行doInBackground时发生错误()在android.os.AsyncTask $ 3.done(AsyncTask.java:304)在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)在java.util.concurrent.FutureTask.setException(FutureTask.java: 222),位于java.util.concurrent.FutureTask.run(FutureTask.java:242),位于android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231),位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor)。 java:util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587)上的java:1112)java.lang.Thread.run(Thread.java:818)上的原因:java.lang.StackOverflowError:堆栈大小1036KB com.google.gson.internal。$ Gson $ Types.canonicalize($ Gson $ Types.java:111)com.google.gson.internal。$ Gson $ Types $ WildcardTypeImpl。($ Gson $ Types.java:553 )在com.google.gson.internal。$ Gson $ Types.canonicalize( $Gson$Types.java:111) at com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:546) at com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:111) com.google.gson.internal上的$ Gson $ Types.java:111)。com.google.gson.internal。$ Gson $ Types.canonicalize上的$ Gson $ Types $ WildcardTypeImpl。($ Gson $ Types.java:546)。 ($ GSON $ Types.java:111)

14:37:03.078 30486-30504/at.guger.email I/art: Background partial concurrent mark sweep GC freed 2071991(33MB) AllocSpace objects, 16(10MB) LOS objects, 30% free, 36MB/52MB, paused 2.105ms total 219.940ms 03-12 14:37:03.088 30486-31452/at.guger.email D/Error: ERR: exClass=java.lang.StackOverflowError 03-12 14:37:03.088 30486-31452/at.guger.email D/Error: ERR: exMsg=stack size 1036KB 03-12 14:37:03.088 30486-31452/at.guger.email D/Error: ERR: file=$Gson$Types.java 03-12 14:37:03.088 30486-31452/at.guger.email D/Error: ERR: class=com.google.gson.internal.$Gson$Types 03-12 14:37:03.088 30486-31452/at.guger.email D/Error: ERR: method=canonicalize line=111 03-12 14:37:03.108 30486-30499/at.guger.email W/art: Suspending all threads took: 10.559ms 03-12 14:37:03.118 30486-31452/at.guger.email D/Error: ERR: stack=java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:304) at java.util.concurrent.FutureTask.finishCompletion(Fu 14:37:03.078 30486-30504 / at.guger.email I / art:释放了背景部分并发标记清除GC 2071991(33MB)AllocSpace对象,16(10MB)LOS对象,30%可用,36MB / 52MB,暂停2.105ms总计219.940ms 03-12 14:37:03.088 30486-31452 / at.guger.email D /错误:错误:exClass = java.lang.StackOverflowError 03-12 14:37:03.088 30486-31452 / at.guger.email D /错误:ERR:exMsg =堆栈大小1036KB 03-12 14:37:03.088 30486-31452 / at.guger.email D /错误:ERR:file = $ Gson $ Types.java 03-12 14:37:03.088 30486-31452 / at.guger.email D /错误:ERR:class = com.google.gson.internal。$ Gson $ Types 03-12 14:37:03.088 30486-31452 / at.guger.email D / Error:错误:方法=规范化行= 111 03-12 14:37:03.108 30486-30499 / at.guger.email W / art:暂停所有线程占用:10.559毫秒03-12 14:37:03.118 30486-31452 / at。 guger.email D /错误:错误:stack = java.lang.RuntimeException:在java.util.concurrent.FutureTask的android.os.AsyncTask $ 3.done(AsyncTask.java:304)执行doInBackground()时发生错误。 finishCompletion(福 tureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.StackOverflowError: stack size 1036KB at com.google.gson.internal.$Gson$Types.canonicalize($Gson$Types.java:111) at com.google.gson.internal.$Gson$Types$WildcardTypeImpl.($Gson$Types.java:553) tureTask.java:355)的java.util.concurrent.FutureTask.setException(FutureTask.java:222)的java.util.concurrent.FutureTask.run(FutureTask.java:242)的android.os.AsyncTask $ SerialExecutor $ 1。在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)处运行(AsyncTask.java:231)在java.lang.Thread处的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587) .run(Thread.java:818)原因:java.lang.StackOverflowError:com.google.gson.internal。$ Gson $ Types.canonicalize($ Gson $ Types.java:111)处的堆栈大小为1036KB 。.gson.internal $ GSON $类型$ WildcardTypeImpl($ GSON $ Types.java:553)

30486-31452/at.guger.email D/Error: ERR: TOTAL BYTES WRITTEN: 2240396 03-12 14:37:03.118 30486-31452/at.guger.email E/JavaBinder: !!! 30486-31452 / at.guger.email D /错误:ERR:已写入总字节数:2240396 03-12 14:37:03.118 30486-31452 / at.guger.email E / JavaBinder:!!! FAILED BINDER TRANSACTION !!! 失败的粘合剂交易! 03-12 14:37:03.118 30486-31452/at.guger.email E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(Binder.java:496) at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4200) at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:89) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 03-12 14:37:03.118 30486-31452 / at.guger.email E / AndroidRuntime:错误报告在android.os.BinderProxy.transact的android.os.BinderProxy.transactNative(Native Method)中崩溃android.os.TransactionTooLargeException(在com.android.internal.os.RuntimeInit $ UncaughtHandler.uncaughtException(RuntimeInit.java:89)处android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4200)处的Binder.java:496)在java.lang.ThreadGroup.uncaughtException处(ThreadGroup.java:693)at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)

My Code worked if I tried to do it on MainThread: 如果我尝试在MainThread上执行,我的代码将起作用:

File dir = new File(mailParcel.getContext().getFilesDir() + "/emails/" + mailParcel.getDirectory() + "/" + foldername);

if (!dir.exists()) dir.mkdirs();

for (File f : dir.listFiles()) {
    f.delete();
}

String fileName;
File file;
Mail[] Mails = mailParcel.getMails();

for (int i = 0; i < Mails.length; i++) {
    fileName = Mails[i].getReceiveDate().toString().replace(" ", "_").replace(":", "-");

    try {
        file = new File(dir, fileName + ".json");

        file.createNewFile();

        Writer writer = new OutputStreamWriter(new FileOutputStream(file));

        Gson gson = new GsonBuilder().create();
        gson.toJson(Mails[i], writer);

        writer.close();
    }
    catch (FileNotFoundException fnfe) {
        fnfe.printStackTrace();
    }
    catch (UnsupportedEncodingException usee) {
        usee.printStackTrace();
    }
    catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

I hope you can help me! 我希望你能帮帮我! If you have another idea instead of for example doing in Asynctask, tell me please! 如果你有另一个想法,而不是在Asynctask做,请告诉我!

The answer is really simple... 答案很简单...

I made an AsyncTask instead of the Thread. 我做了一个AsyncTask而不是Thread。 Then the code works. 然后代码起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 执行queryIntentActivities时android.os.TransactionTooLargeException - android.os.TransactionTooLargeException when executing queryIntentActivities android.os.TransactionTooLargeException检索已安装的应用程序 - android.os.TransactionTooLargeException retrieving installed applications android.os.TransactionTooLargeException:数据包大小NOUGAT错误 - android.os.TransactionTooLargeException: data parcel size NOUGAT ERROR 从 Fragment 移动到 Activity 导致 android.os.TransactionTooLargeException - Move from Fragment to Activity Causes android.os.TransactionTooLargeException android.app.DialogFragment.onStart上的android.os.TransactionTooLargeException - android.os.TransactionTooLargeException at android.app.DialogFragment.onStart 由于java.lang.RuntimeException而在图库中崩溃:android.os.TransactionTooLargeException:数据包大小539544字节 - Crash in gallery due to java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 539544 bytes 碎片化newInstance保存到捆绑的太多数据-android.os.TransactionTooLargeException - Fragment newInstance too much data saved to bundle - android.os.TransactionTooLargeException android,asynctask,在doInBackground()中写入/读取数据库失败 - android, asynctask, writing/reading to the database in doInBackground() fails 调用 TakePicture 时出现 Android TransactionTooLargeException - Android TransactionTooLargeException when calling TakePicture 当我将json转换为gson对象预期BEGIN_ARRAY但被BEGIN_OBJECT时发生Gson错误 - Gson error occurs when I convert json to gson object Expected BEGIN_ARRAY but was BEGIN_OBJECT
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM