TransactionTooLargeException

TransactionTooLargeException

我的应用程序读取了所有已安装的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)

最佳答案

活页夹交易限制为1MB,这意味着大多数IPC调用的大小必须适中。

如果从TransactionTooLargeException(例如PackageManager)检索数据时遇到getPackageInfo()或类似的Binder故障,请尝试将请求拆分为多个调用,每个调用的标志数更少(例如GET_META_DATA)。希望这可以将任何单个事务的大小减小到1MB的限制以下。

另外,如果您正在使用PackageManager上的调用以返回多个结果(例如getInstalledPackages(),请尝试在该调用上不要求任何标志,然后分别获取每个包的值)以避免一次获取大量条目上的大量数据。

而且,当然,仅使用您需要的标志,尤其是在您的调用可能包含一些标志的情况下。 GET_META_DATA是一个典型的例子:许多应用程序都在使用它(例如,用于Play服务),但是如果您不需要了解元数据信息,就不要请求它。

关于Android Package Manager因TransactionTooLargeException死亡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24253976/

10-10 23:45