【发布时间】:2014-08-06 21:14:45
【问题描述】:
我的应用会读取所有已安装 APK 文件的列表,然后遍历列表以读取 APK 信息,但是它会引发 TransactionTooLargeException 异常。
从我在这里读到的http://developer.android.com/reference/android/os/TransactionTooLargeException.html,谷歌建议将大交易分解成小交易。然而,这似乎发生在遍历 APK 列表的中间。如果我捕捉到异常并继续它,其余的都可以正常工作。有没有办法在调用 getPackageInfo 时减少内存使用?即使在它已经返回之后,该调用是否会保留一些东西。
这是发生时的痕迹:
at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:89)
at com.myapp.appreader.getAppDetails(Appreader.java:207)
at com.myapp.appreader.collectData(Appreader.java:99)
at com.myapp.appreader.AppDataCollectionTask.run(AppDataCollectionTask.java:26)
at com.myapp.appreader.service.AppDataTaskExecutor$AppDataAsyncTask.executeTask(AppDataTaskExecutor.java:439)
at com.myapp.appreader.service.AppDataTaskExecutor$AppDataAsyncTask.doInBackground(AppDataTaskExecutor.java:327)
at com.myapp.appreader.service.AppDataTaskExecutor$AppDataAsyncTask.doInBackground(AppDataTaskExecutor.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)\nCaused by: android.os.TransactionTooLargeExceptionat android.os.BinderProxy.transact(Native Method)
at android.content.pm.IPackageManager$Stub$Proxy.getPackageInfo(IPackageManager.java:1538)
at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:84)
【问题讨论】:
-
尝试在每次调用时使用较小的标志列表。 IOW,不要在一次调用中询问所有可能的标志,而是尝试使用标志的子集进行两到三个调用。
-
现在我在通话中有 7 个标志,是不是太大了?我将尝试将其拆分为 2-3 次调用,看看情况如何。现在的错误总是发生在循环中的第 74 个 APK 上。然而,在它之后还有更多,并且所有这些(以及之前的那些)都运行良好。
-
"现在我在通话中有 7 个标志,是不是太大了?" -- 取决于包的复杂程度。包中的组件和其他东西越多,结果集就越大。也许第 74 个应用程序只是一个非常复杂的应用程序。
-
这很有趣。我想这是一个复杂的应用程序(谷歌地图)。但是我试图只调用谷歌地图的 getPackageInfo,它没有任何问题。所以显然循环也是异常的一个因素。一些资源没有足够快地释放。将循环分成几个较小的循环值得一试吗?
-
“显然循环也是异常的一个因素”——我没想到会这样,但我当然不能排除它。 “将循环分成几个更小的循环值得一试吗?” ——是的,只是因为你只有这么多的选择。 :-) 如果大小没有帮助(更少的标志),那么时间可能(通过循环更慢的迭代)。在那之后,我没有想法了。
标签: android exception transactions android-package-managers