[英]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.