uni-app 超出限制导致APP崩溃 TransactionTooLargeException

发布于 1周前 作者 nodeper 来自 Uni-App

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


1 回复

在开发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崩溃问题。

回到顶部