我TransactionTooLargeException
最近遇到了这个问题,并正在寻找一种可能的解决方案来避免它。最后,我找不到任何可行的方法。在大多数答案中,您会发现人们推荐了不同的方法来避免此异常,但没有合适的示例。
这是我为解决此问题所做的工作,这在某些地方可能不是理想的解决方案,并且也有一些限制。
第 1 步 -编写一个将捆绑包转换为字符串并将其存储在 Shared Preference 中的类。
public class ActivityBridge {
private static final String KEY_ACTIVITY_BRIDGE = "ACTIVITY_BRIDGE";
private final Context context;
private SharedPreferences sharedPreferences;
public ActivityBridge(Context context) {
this.context = context;
sharedPreferences = context.getSharedPreferences(KEY_ACTIVITY_BRIDGE, Context.MODE_PRIVATE);
}
@SuppressLint("ApplySharedPref")
public void putData(Bundle bundle, Intent intent) {
sharedPreferences.edit()
.putString(
intent.toString(),
Base64.encodeToString(bundleToBytes(bundle), 0)
)
.commit();
}
@SuppressLint("ApplySharedPref")
public Bundle getData(Intent intent) {
Bundle bundle;
final String bundleString = sharedPreferences.getString(intent.toString(), "");
if (TextUtils.isEmpty(bundleString)) {
return null;
} else {
bundle = bytesToBundle(Base64.decode(bundleString, 0));
}
sharedPreferences.edit()
.clear()
.commit();
return bundle;
}
public byte[] bundleToBytes(Bundle bundle) {
Parcel parcel = Parcel.obtain();
parcel.writeBundle(bundle);
byte[] bytes = parcel.marshall();
parcel.recycle();
return bytes;
}
public Bundle bytesToBundle(byte[] bytes) {
Parcel parcel = Parcel.obtain();
parcel.unmarshall(bytes, 0, bytes.length);
parcel.setDataPosition(0);
Bundle bundle = parcel.readBundle(context.getClassLoader());
parcel.recycle();
return bundle;
}
}
第 2 步 -用法
在创建意图时
Intent intent = new Intent(ActivityA.this, ActivityB.class);
Bundle bundle = new Bundle();
bundle.putString("<KEY>", "<VALUE>");
new ActivityBridge(ActivityA.this).putData(bundle, intent);
startActivity(intent);
在提取捆绑包时
Bundle bundle = new ActivityBridge(this).getData(getIntent());
注意:此方案读取后会清除存储的Bundle,如果重新创建Activity,则不会返回Bundle。这是一种解决方法,任何建议或问题都将受到高度赞赏。