uni-app选择图片API uni.chooseImage(OBJECT) 打开相册后大概5-10秒系统弹出无响应 点击等待可正常使用

uni-app选择图片API uni.chooseImage(OBJECT) 打开相册后大概5-10秒系统弹出无响应 点击等待可正常使用

示例代码:

    count: 1,  
    sizeType: ['original'], // 可以指定是原图还是压缩图,默认二者都有  
    sourceType: ['album'],  //从相册选择  
    success: function (res) {  
        uni.compressImage({  
            src: res.tempFilePaths[0],  
            quality: 60,  
            success: res => {  
                const uploadTask = uni.uploadFile({  
                    url: url,  
                    filePath: res.tempFilePath,  
                    name: 'file',  
                    header: {  
                        'Authorization': 'Bearer ' + uni.getStorageSync('token')  
                    },  
                    success: (uploadFileRes) => {  
                        let u_data = JSON.parse(uploadFileRes.data)  
                        if(u_data.status == 200) {  
                            editUserAvatar({avatar: u_data.data.data}).then(edit_res => {  
                                if(edit_res.status == 200) {  
                                    that.$store.state.userData.avatar = u_data.data.data  
                                } else {  
                                    uni.showToast({  
                                        icon: 'none',  
                                        title: '修改失败,请稍后重试!'  
                                    })  
                                }  
                            })  
                        } else {  
                            uni.showToast({  
                                icon: 'none',  
                                title: '上传失败,请稍后重试!'  
                            })  
                        }  
                    }  
                })  
                that.viewProgress = true  
                uploadTask.onProgressUpdate((res) => {  
                    that.progress = res.progress  

                    if (res.progress >= 100) {  
                        that.viewProgress = false  
                    }  
                })  
            }  
        })  
    }  
})```

操作步骤:

手机中图片多一点,7000张以上,少的话好像没问题,之后调起图片选择api,手机系统是Android11

预期结果:

调起API快速显示相册,长时间等待选择图片,无系统弹出无响应弹框

实际结果:

加载图片较慢(3-5s),加载图片期间不能返回,加载图片后5-10s出现无响应系统弹窗,点击等待后可以继续使用,但是有这个弹窗很麻烦。

bug描述:

正常调用uni.chooseImage(OBJECT) API,进入相册选择图片(图片大概在6-7千左右),默认打开的是所有图片分类,加载图片需要等待3-5s左右,加载显示出图片后大概5-10s后系统层弹出 无响应,但是点击等待可以继续使用。

猜测是因为调起选择图片时,APP持续等待触发了系统层无响应事件,希望能够解决和优化图片选择,很重要的API,看到社区有人询问但是没人回答,就很难过。


更多关于uni-app选择图片API uni.chooseImage(OBJECT) 打开相册后大概5-10秒系统弹出无响应 点击等待可正常使用的实战教程也可以访问 https://www.itying.com/category-93-b0.html

21 回复

HX3.2.9已修复该问题

更多关于uni-app选择图片API uni.chooseImage(OBJECT) 打开相册后大概5-10秒系统弹出无响应 点击等待可正常使用的实战教程也可以访问 https://www.itying.com/category-93-b0.html


你好 请试用一下https://www.html5plus.org/doc/zh_cn/gallery.html#plus.gallery.pick 看看是否还会卡很久

还是那种,10s内弹出无响应

好像不单单是我这个手机的型号,看别人手机也有这种问题,照片多的话必会出现无响应,照片少的话没啥问题

回复 1***@qq.com: 手机设备中都是什么图片 理论图片数量不会对图片预览有影响才对

回复 DCloud_Android_ST: 正常的截图照片,还有一些应用内部的素材图,显示预览图比较慢,几秒之后就弹出无响应了,同品牌手机不同型号照片少的时候测试没有弹出无响应,社区看到别的品牌手机android11 也有这种情况

回复 DCloud_Android_ST: https://ask.dcloud.net.cn/question/120660 这个我联系他了,他那边最后也没解决,只能硬着头皮用了

回复 DCloud_Android_ST: 或者有没有其他选择图片的方式,插件市场有个支付宝扫码插件里面选择相册是打开文件系统,那个就没问题,但是那个是和文件混在一起的

回复 1***@qq.com: 好的 我们研究研究

回复 DCloud_Android_ST: 好的

回复 DCloud_Android_ST: 另外一个安卓机 一加8Tpro 2700多张照片,一切正常

回复 DCloud_Android_ST: 刚试着把一些应用内部的素材小图删掉之后,就可以正常使用了,删除了3000多张小图,你们测试的时候 可以试一下多放点2020 5050 150 * 150之类的小图

回复 1***@qq.com: 好的

和之前的问题 https://ask.dcloud.net.cn/question/128641 类似,我这边是用户反馈选择相册会闪退,某些用户必现,但是友盟的日志一直采集不到

身边有台 realme 的安卓机,不会闪退,但是打开的时候会等待5秒左右才出现图片列表,本地相册差不多8k张图片。

回复 青阳_1900: 应该跟我这情况一样,我手机里6千多张图片,我朋友手机几百张图片没啥问题

市场里面有三方原生插件,可以选择图片,但是都收费,就没没有尝试了

回复 1***@qq.com: 看了 uni.chooseImage 的源码,最终实现唤起的是hmlt5plus的 plus.gallery.pick 也是原生实现,所以他上面让你直接用 pick 其实想缩小问题范围,根因还是原生实现存在性能问题,优化没做好

问题已确认 下个版本会修复该问题

确实,10s左右弹出无响应,还有在选择较大图片时,APP会崩溃自动重启

这个问题是由于Android系统对应用主线程响应时间的监控机制导致的。当uni.chooseImage()加载大量图片时(7000+张),系统相册组件需要扫描和渲染大量图片数据,这个过程会阻塞主线程,超过Android系统的ANR(Application Not Responding)检测阈值(通常5秒),从而触发系统弹窗。

解决方案:

  1. 优化调用时机:避免在页面初始化或用户频繁操作时调用,可考虑延迟加载或用户主动触发。

  2. 分批加载建议:虽然uni.chooseImage()本身不支持分批加载,但可以提示用户选择特定相册分类而非"所有图片"。部分Android系统相册会按时间或文件夹分类,选择子分类可减少一次性加载数量。

  3. 使用原生插件:对于图片数量特别大的场景,建议使用原生插件(如uni-album)实现自定义相册,支持虚拟滚动和懒加载。

  4. 压缩策略调整:在success回调中立即执行compressImage和uploadFile可能加剧主线程阻塞。建议将压缩和上传操作放入setTimeout或Promise异步队列:

success: function (res) {
    setTimeout(() => {
        // 压缩和上传逻辑
    }, 0)
}
回到顶部