日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android?Intent傳遞大量數據出現問題解決_Android

作者:AnRFDev ? 更新時間: 2022-09-21 編程語言

正文

官方文檔?https://developer.android.google.cn/guide/components/activities/parcelables-and-bundles

在sendBroadcast,startActivity時,我們會用到Intent。 Intent可以攜帶一些數據,比如基本類型數據int、Boolean,或是String,或是序列化對象,Parcelable與Serializable。

異常TransactionTooLargeException

Intent傳遞數據時,如果數據太大,可能會出現異常TransactionTooLargeException。

注意:

在 Android 7.0(API 級別 24)或更高版本中,系統會在運行時拋出 TransactionTooLargeException 異常。在較低版本的 Android 中,系統僅在 logcat 中顯示警告。

TransactionTooLargeException繼承了RemoteException

package android.os;
public class TransactionTooLargeException extends RemoteException {
    public TransactionTooLargeException() {
        super();
    }
    public TransactionTooLargeException(String msg) {
        super(msg);
    }
}

追蹤到Binder,它的transactNative方法會報出RemoteException

public native boolean transactNative(int code, Parcel data, Parcel reply,
            int flags) throws RemoteException;

拋出異常與Binder有關。

通過 intent 發送數據時,應小心地將數據大小限制為幾 KB。發送過多數據會導致系統拋出?TransactionTooLargeException?異常。

Intent攜帶信息的大小受Binder限制

Intent攜帶信息的大小其實是受Binder限制。本文標題也可以改為“Binder傳遞數據大小限制”。

數據以Parcel對象的形式存放在Binder傳遞緩存中。 如果數據或返回值比傳遞buffer大,則此次傳遞調用失敗并拋出TransactionTooLargeException異常。

Binder事務緩沖區有一個限定大小,通常是1Mb。由進程中正在處理的所有事務共享緩存空間。

由于此限制是進程級別而不是 Activity 級別的限制,因此這些事務包括應用中的所有 binder 事務,例如 onSaveInstanceStatestartActivity 以及與系統的任何互動。超過大小限制時,將引發 TransactionTooLargeException。

對于 savedInstanceState 的具體情況,應將數據量保持在較小的規模,因為只要用戶可以返回到該 Activity,系統進程就需要保留所提供的數據(即使 Activity 的進程已終止)。我們建議您將保存的狀態保持在 50k 數據以下。

為什么Binder要限制傳輸數據的大小

個人推測,作為一種IPC的方式,Binder并不是為傳輸大量數據而設計。

替代方案

當需要傳遞長字符串、Bitmap等時,不要考慮使用Intent傳遞數據的方案

1、單例

2、EventBus

3、Application

4、持久化數據

原文鏈接:https://juejin.cn/post/7067846053042585637

欄目分類
最近更新