uni-app 在有地图的情况下选择图片上传组件上传图片会导致APP崩溃

uni-app 在有地图的情况下选择图片上传组件上传图片会导致APP崩溃

示例代码:

直接运行管理员可见的附件工程。

操作步骤:

打开,登录,选择定位,选择系统更换,单击新建,划到最下面,单击图片上传组件,上传图片,选择相册。

预期结果:

正常浏览图片

实际结果:

崩溃

bug描述:

在有地图的情况下,使用上传组件上传图片,打开图片选择器后,直接崩溃。 Android Studio的Logcat提示:

Process: io.dcloud.HBuilder, PID: 19094  
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 1046256 bytes  
    at android.app.ActivityClient.activityStopped(ActivityClient.java:86)  
    at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:143)  
    at android.os.Handler.handleCallback(Handler.java:938)  
    at android.os.Handler.dispatchMessage(Handler.java:99)  
    at android.os.Looper.loopOnce(Looper.java:210)  
    at android.os.Looper.loop(Looper.java:299)  
    at android.app.ActivityThread.main(ActivityThread.java:8292)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)  
Caused by: android.os.TransactionTooLargeException: data parcel size 1046256 bytes  
    at android.os.BinderProxy.transactNative(Native Method)  
    at android.os.BinderProxy.transact(BinderProxy.java:624)  
    at android.app.IActivityClientController$Stub$Proxy.activityStopped(IActivityClientController.java:1297)  
    at android.app.ActivityClient.activityStopped(ActivityClient.java:83)  
    at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:143)  
    at android.os.Handler.handleCallback(Handler.java:938)  
    at android.os.Handler.dispatchMessage(Handler.java:99)  
    at android.os.Looper.loopOnce(Looper.java:210)  
    at android.os.Looper.loop(Looper.java:299)  
    at android.app.ActivityThread.main(ActivityThread.java:8292)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)  

使用官方基座一样有问题。


更多关于uni-app 在有地图的情况下选择图片上传组件上传图片会导致APP崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

开发人员帮忙看看。

更多关于uni-app 在有地图的情况下选择图片上传组件上传图片会导致APP崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在使用 uni-app 开发应用时,如果在地图组件(如 map 组件)和图片上传组件(如 uni.chooseImage)同时存在的情况下,可能会导致应用崩溃。这种情况通常与内存管理、资源占用或原生模块冲突有关。以下是一些可能的原因和解决方案:


可能的原因

  1. 内存占用过高
    地图组件和图片上传组件同时使用时,可能会占用大量内存,尤其是在处理高分辨率图片时,导致应用崩溃。

  2. 原生模块冲突
    地图组件和图片上传组件可能依赖不同的原生模块,这些模块在同时使用时可能会产生冲突。

  3. 渲染性能问题
    地图组件和图片上传组件可能同时进行复杂的渲染操作,导致主线程阻塞或 GPU 资源不足。

  4. 平台兼容性问题
    不同平台(如 iOS 和 Android)对内存管理和资源调用的方式不同,可能导致在某些平台上出现崩溃。


解决方案

  1. 优化内存使用

    • 在调用 uni.chooseImage 时,限制图片的尺寸和质量。例如:
      uni.chooseImage({
        count: 1,
        sizeType: ['compressed'], // 压缩图片
        sourceType: ['album', 'camera'],
        success: (res) => {
          console.log('图片路径:', res.tempFilePaths[0]);
        }
      });
      
    • 避免同时加载过多高分辨率图片。
  2. 延迟加载或分步操作

    • 在地图和图片上传功能之间加入延迟,避免同时操作。例如,先加载地图,再触发图片上传。
    • 使用 setTimeoutPromise 进行分步处理。
  3. 检查原生模块兼容性

    • 确保使用的第三方插件或原生模块兼容 uni-app 的版本。
    • 如果使用了自定义原生模块,检查是否存在冲突。
  4. 降低地图组件的渲染压力

    • 减少地图上的标记点(markers)或覆盖物(overlays)。
    • 使用 map 组件的 show-location 属性时,避免频繁更新位置。
  5. 使用条件渲染

    • 在需要上传图片时,隐藏地图组件;在上传完成后,再重新显示地图组件。例如:
      <template>
        <view>
          <map v-if="!isUploading" style="width: 100%; height: 300px;"></map>
          <button @click="chooseImage">上传图片</button>
        </view>
      </template>
      <script>
      export default {
        data() {
          return {
            isUploading: false,
          };
        },
        methods: {
          chooseImage() {
            this.isUploading = true;
            uni.chooseImage({
              count: 1,
              success: (res) => {
                console.log('图片路径:', res.tempFilePaths[0]);
                this.isUploading = false;
              },
              fail: () => {
                this.isUploading = false;
              }
            });
          }
        }
      };
      </script>
回到顶部