【问题标题】:Android remote method data limitAndroid远程方法数据限制
【发布时间】:2012-01-16 02:12:45
【问题描述】:

对于我的应用程序,我需要在我的活动和服务之间传递数据,这两者都在不同的进程中。我知道 Google 建议在将意图发送到最低限度(不是全尺寸位图)时保持数据传递。当您通过 AIDL 与服务通信并希望通过远程方法调用传递数据时,是否适用类似的策略?

【问题讨论】:

    标签: android android-binder


    【解决方案1】:

    http://developer.android.com/reference/android/os/TransactionTooLargeException.html

    " 在远程过程调用期间,调用的参数和返回值作为 Parcel 对象传输,存储在 Binder 事务缓冲区中。如果参数或返回值太大而无法放入事务缓冲区,则调用将失败并抛出 TransactionTooLargeException。

    Binder 事务缓冲区有一个有限的固定大小,目前为 1Mb,由进程正在进行的所有事务共享。 "

    看来,您永远不应该发送任何大小超过 1MB 的参数。当然,如上面的 android 网站所述,您也可能因较小的参数而失败。

    【讨论】:

      【解决方案2】:

      我不确定 AIDL,但通常您确实希望将Intent 附加功能保持在最低限度。更好的解决方案可能是实现您自己的ContentProvider 并使用它为您的其他进程提供数据。这将允许托管数据传输,并为您提供ContentProvider API 提供的所有额外保护。

      【讨论】:

      • 我或许应该提供更多细节。我的活动从引擎获取一个字节数组。有可能,我可能会得到一个新的字节数组,而现有的字节尚未保存/仍在保存。我想先将这些数组保存在 RAM 缓冲区中,然后才能保存它们。这就是我打算在我的服务中做的事情。
      • 那么创建一个静态变量来存储这些字节数组?不过,您需要注意一次要处理的数据量,因为 Android VM 限制非常低,而且我不确定您到底在做什么。如果它与渲染有关,您可能需要考虑替代解决方案,例如使用为您管理缓冲的Vertex Buffer Object
      • 一个静态变量在 2 个不同的进程中是不可见的。我需要将字节数组从活动进程传递给服务进程,以便服务进程可以在后台进行保存,即使活动本身退出。
      • 对不起,你没有提到它是一个活动和一个过程。在我看来,您应该使用BroadcastReceiverContentProvider 来管理此事务。
      • 可能不是很清楚,但我在最初的问题中提到了它 - “对于我的应用程序,我需要在我的活动和服务之间传递数据,这两者都在不同的进程中。”我仍然不清楚如何在进程之间传递数据?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多