【发布时间】:2013-04-02 21:16:05
【问题描述】:
我收到一个用户的邮件,他安装了很多应用程序,当我的应用程序使用此代码收集活动信息时,他遇到了问题:
getPackageManager().queryIntentActivities(mAinIntent, 0)
全部来源:https://github.com/ligi/FAST
这就是发生的事情
Caused by: java.lang.RuntimeException: Package manager has died
at android.app.ApplicationPackageManager.queryIntentActivities(ApplicationPackageManager.java:479)
at org.ligi.fast.BaseAppGatherAsyncTask.doInBackground(BaseAppGatherAsyncTask.java:34)
at org.ligi.fast.BaseAppGatherAsyncTask.doInBackground(BaseAppGatherAsyncTask.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 5 more
Caused by: android.os.TransactionTooLargeExceptionTransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.content.pm.IPackageManager$Stub$Proxy.queryIntentActivities(IPackageManager.java:2230)
at android.app.ApplicationPackageManager.queryIntentActivities(ApplicationPackageManager.java:473)
... 9 more
Log:
0 D: Writing unhandled exception to: /data/data/org.ligi.fast/files/3.7-1364933885194.tracedroid
似乎有一个问题,我在 1mb 边界上运行,但是如何摆脱那里?我还能如何获得所需的信息?有没有办法把数据分块?
【问题讨论】:
-
这是一个错字
TransactionTooLargeExceptionTransactionTooLargeException? See this Binder 事务缓冲区有一个有限的固定大小,目前为 1Mb,由该进程正在进行的所有事务共享。因此,当有许多事务正在进行时,即使大多数单个事务的大小适中,也会引发此异常。 -
AppInfoclass,private BitmapDrawable icon;...它们是否占用了太多内存?为什么要从 AsyncTask 内部传递多个Contexts副本? -
是的 - 似乎是一个 c&p'o - 不知道这是如何翻倍的。您是否看到了解决该问题的方法?
-
问题是,如果它扫描所有应用程序,应用程序的图标大小不同,可能是它,也许使用
WeakReference到位图?听起来AppInfo类需要优化... -
@t0mm13b 我同意@ligi。在调用
queryIntentActivities时,我看不到这个异常与可绘制大小有什么关系。 @ligi,不幸的是,我怀疑您不走运。PackageManager调用没有分页机制或类似的机制。