【问题标题】:Is there a size limit for putParcelableArrayListExtra?putParcelableArrayListExtra 有大小限制吗?
【发布时间】:2020-02-23 06:48:02
【问题描述】:

我正在使用 putParcelableArrayListExtra 将包含设备上所有歌曲的 ArrayList 发送到另一个 Activity。

现在我想知道通过putParcelableArrayListExtra 的意图发送数据是否有任何大小限制

例如。如果某人的设备上有超过 10k 首歌曲怎么办,这在将包含大量歌曲的数组列表发送到另一个 Activity 时会导致任何问题吗?

我的代码

@Override
   public void onClickItem(int position) {
        if (getActivity() != null) {
            myList = Main.getInstance().songs;
            Intent intent = new Intent(getActivity(), ListSongsActivity.class);
            intent.putParcelableArrayListExtra("myList ", myList);
            startActivity(intent);
        }
}

【问题讨论】:

    标签: java android arraylist android-intent


    【解决方案1】:

    在执行 Activity 事务时,bundle 有大小限制。如果超出限制,则抛出 TransactionTooLargeException

    The Binder transaction buffer has a limited fixed size, currently 1Mb,
    which is shared by all transactions in progress for the process.
    Consequently, this exception can be thrown when there are many
    transactions in progress even when most of the individual transactions
    are of moderate size.
    

    参考:https://developer.android.com/reference/android/os/TransactionTooLargeException

    【讨论】:

    • 1Mb 是什么意思? 1Mb 的数据存储在 Arraylist 中?
    • 1Mb 是指放在与 Intent 一起存在的包中的数据。在您的情况下,您只是发送带有 Intent 的 ArrayList,然后是 1Mb 是指存储在 ArrayList 中的数据。
    • 我如何确定我的数组列表的大小?在我的设备上,我有大约 350 首歌曲可以正常工作,但如果我有超过 10000 首或更多歌曲怎么办?我应该寻找其他选项将大型数组列表传递给另一个活动吗?
    • 不建议通过捆绑传递这么大的数据。相反,您应该使用 DBLruCache 来存储该数据,然后将存储该数据后获得的 id 发送到下一个 Activity。
    • 那么如果您只需要活动事务的数据,那么您可能需要使用LruCache。如果你想存储更长时间的数据,那么你应该使用像 FileDB 这样的持久化存储。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2011-03-13
    相关资源
    最近更新 更多