uni-app 超出限制导致APP崩溃 TransactionTooLargeException
uni-app 超出限制导致APP崩溃 TransactionTooLargeException
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 1080536 bytes at android.app.ActivityClient.activityStopped(ActivityClient.java:104) at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:143) at android.os.Handler.handleCallback(Handler.java:966) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:293) at android.app.ActivityThread.loopProcess(ActivityThread.java:9998) at android.app.ActivityThread.main(ActivityThread.java:9987) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1240) Caused by: android.os.TransactionTooLargeException: data parcel size 1080536 bytes at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(BinderProxy.java:607) at android.app.IActivityClientController$Stub$Proxy.activityStopped(IActivityClientController.java:1313) at android.app.ActivityClient.activityStopped(ActivityClient.java:101) … 10 more
在开发uni-app时,遇到因数据传递超出限制而导致的TransactionTooLargeException
崩溃问题,通常是由于在Intent或跨组件通信中传递了过大的数据。虽然uni-app主要基于Vue.js进行开发,并且运行在如小程序、H5、App等多个平台上,但底层实现(特别是原生App部分)可能会遇到Android原生的问题。以下是一些可能的解决方案,通过代码示例展示如何避免这类问题。
1. 使用全局状态管理
对于需要在多个页面或组件间共享的大数据,可以考虑使用全局状态管理,如Vuex(在uni-app中通常使用store
目录下的文件)。这样,可以避免通过Intent传递大数据。
示例:
// store/index.js
const store = new Vuex.Store({
state: {
largeData: null,
},
mutations: {
setLargeData(state, data) {
state.largeData = data;
}
},
actions: {
updateLargeData({ commit }, data) {
commit('setLargeData', data);
}
}
});
export default store;
2. 分割数据
如果确实需要通过Intent传递数据,考虑将数据分割成小块。虽然这不是uni-app直接的操作,但在原生模块或插件开发中可能用到。
3. 使用文件存储
对于非常大的数据集,可以考虑将数据写入文件,然后在需要时读取。这样可以避免直接在内存中传递大数据。
示例(使用uni-app的文件系统API):
// 保存数据到文件
const fs = uni.getFileSystemManager();
const filePath = `${uni.env.USER_DATA_PATH}/largeData.json`;
fs.writeFile({
filePath,
data: JSON.stringify(largeData),
encoding: 'utf8',
success: () => {
console.log('Data saved');
}
});
// 从文件读取数据
fs.readFile({
filePath,
encoding: 'utf8',
success: res => {
const largeData = JSON.parse(res.data);
console.log('Data loaded', largeData);
}
});
4. 检查数据大小
在传递数据之前,检查数据的大小,如果超出限制,则采取适当的措施,如提示用户或进行数据压缩。
示例:
function checkDataSize(data) {
const dataSize = new Blob([JSON.stringify(data)]).size;
const maxSize = 1024 * 1024; // 1MB限制
if (dataSize > maxSize) {
console.error('Data size exceeds limit');
// 处理超出限制的情况,如提示用户
}
}
通过上述方法,可以有效避免在uni-app开发中因数据传递过大导致的TransactionTooLargeException
崩溃问题。