uni-app 页面多次触发录音事件导致app闪退

uni-app 页面多次触发录音事件导致app闪退

项目信息 详情
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 win10
HBuilderX类型 正式
HBuilderX版本号 4.08
手机系统 Android
手机系统版本号 Android 11
手机厂商 小米
手机机型 小米10青春版
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

/**
 * 初始化-录音监听事件
 */
initRecorderListeners() {
  // 监听录音开始
  recorderManager.onStart(() => {
    let auRef
    if (this.isGroup) {
      auRef = this.$refs['actionRef' + this.currentUser.id][0]
    } else {
      auRef = this.$refs['actionRef']
    }
    auRef.audio.startTime = Date.now()
    auRef.audio.recording = true
  })

  //监听录音结束-发送
  recorderManager.onStop((res) => {
    let auRef, id
    let endTime = Date.now()
    id = this.currentUser.id
    if (this.isGroup) {
      auRef = this.$refs['actionRef' + this.currentUser.id][0]
    } else {
      auRef = this.$refs['actionRef']
    }

    let duration = endTime - auRef.audio.startTime
    if (duration < 1000) {
      uni.showToast({
        icon: 'error',
        title: '录音时间太短',
        duration: 500
      })
      setTimeout(() => {
        auRef.audio.recording = false
      }, 500)
      return
    }
    res.duration = duration
    this.sendAudioMessage(res.tempFilePath, id)

    setTimeout(() => {
      auRef.audio.recording = false
    }, 500)
  })
}

操作步骤:

  • 多次点击录音

预期结果:

  • 不闪退

实际结果:

  • 闪退

bug描述:

页面写了录音的监听,多次触发录音事件,直接闪退,控制台不输出任何错误日志


更多关于uni-app 页面多次触发录音事件导致app闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 页面多次触发录音事件导致app闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在 uni-app 中,如果页面多次触发录音事件导致应用闪退,通常是由于资源未正确释放或重复调用录音 API 导致的。以下是一些可能的解决方案和优化建议:


1. 确保录音资源正确释放

  • 在每次录音结束后,确保调用 recorderManager.stop() 来停止录音并释放资源。
  • 在页面卸载时(如 onUnload 生命周期),停止录音并销毁 recorderManager 实例。
let recorderManager = uni.getRecorderManager();

// 开始录音
recorderManager.start();

// 停止录音
recorderManager.stop();

// 页面卸载时释放资源
onUnload() {
  recorderManager.stop();
}

2. 避免重复创建录音实例

  • 确保 recorderManager 是单例模式,避免在每次触发录音事件时重新创建 recorderManager 实例。
  • 可以将 recorderManager 定义在页面或组件的 data 中,并在 onLoad 生命周期中初始化。
export default {
  data() {
    return {
      recorderManager: null,
    };
  },
  onLoad() {
    this.recorderManager = uni.getRecorderManager();
  },
};

3. 限制录音触发频率

  • 使用防抖(debounce)或节流(throttle)技术,避免短时间内多次触发录音事件。
  • 例如,使用防抖函数延迟录音启动:
function debounce(func, wait) {
  let timeout;
  return function (...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(this, args), wait);
  };
}

// 防抖处理后的录音启动函数
const startRecording = debounce(() => {
  this.recorderManager.start();
}, 500);

4. 检查录音权限

  • 确保应用已经获取了录音权限,否则可能会导致录音失败或应用崩溃。
  • 可以使用 uni.authorizeuni.getSetting 检查并请求录音权限。
uni.getSetting({
  success(res) {
    if (!res.authSetting['scope.record']) {
      uni.authorize({
        scope: 'scope.record',
        success() {
          console.log('录音权限已授权');
        },
        fail() {
          console.log('录音权限未授权');
        },
      });
    }
  },
});

5. 捕获并处理异常

  • 在录音过程中捕获异常,避免因异常导致应用崩溃。
  • 使用 try-catch 捕获可能的错误并处理。
try {
  this.recorderManager.start();
} catch (error) {
  console.error('录音启动失败:', error);
}

6. 检查设备性能和内存

  • 如果设备性能较低或内存不足,频繁调用录音 API 可能会导致应用崩溃。
  • 可以优化代码逻辑,减少不必要的操作,或者提示用户设备性能不足。

7. 使用 onError 回调处理录音错误

  • recorderManager 提供了 onError 回调,可以在录音出错时进行处理。
recorderManager.onError((error) => {
  console.error('录音出错:', error);
  // 停止录音并释放资源
  recorderManager.stop();
});

8. 调试日志

  • 在录音的各个阶段(开始、停止、出错)添加日志,帮助定位问题。
  • 例如:
recorderManager.onStart(() => {
  console.log('录音开始');
});

recorderManager.onStop((res) => {
  console.log('录音结束', res);
});

recorderManager.onError((error) => {
  console.error('录音出错:', error);
});
回到顶部