洛洛遥 2024-05-19 16:11 采纳率: 66.7%
浏览 12

uniapp获取大量联系人闪退

使用h5原生获取手机通讯录联系人,少量数据能直接获取到, 但当获取的数量达到两三万的时候,应用直接闪退了,目前找了一些文档,也没有啥解决方案。想问问各位有没有什么解决思路


plus.contacts.getAddressBook(phoneNum, addressbook => {
      addressbook.find(["displayName", "phoneNumbers"], async contacts => {
       
      }, () => {
  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-05-19 16:11
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【您想要解决的问题】:您提问的目的是解决在使用uniapp开发应用时,通过H5原生方式获取手机通讯录联系人时,当联系人数量达到两三万时应用出现闪退的问题。

    【问题出现原因】:

    1. 内存不足:当联系人数量极大时,一次性加载所有联系人数据可能会导致应用内存不足,从而触发闪退。
    2. 性能瓶颈:大量数据的处理需要较高的计算资源,如果处理不当,可能会造成性能瓶颈,导致应用响应不及时或崩溃。
    3. API限制:某些平台或框架可能对一次性获取的数据量有限制,超过限制可能导致API调用失败或应用崩溃。

    【问题解决方案】:

    1. 分批处理:不要一次性加载所有联系人,而是分批次进行加载和处理。
    2. 优化数据处理:对获取的数据进行优化处理,比如只加载必要的字段,减少内存占用。
    3. 使用Web Workers:考虑使用Web Workers在后台线程处理数据,避免阻塞主线程。
    4. 增加错误处理:增加错误处理机制,当出现异常时能够及时捕获并处理,避免应用崩溃。

    【提供代码】: 以下是一个示例代码,展示了如何分批次获取联系人数据:

    // 假设每次处理的联系人数量
    const BATCH_SIZE = 500;
    
    // 模拟获取联系人数据的函数
    function fetchContacts(page, size) {
      // 这里应该是调用实际的API获取数据
      // 返回一个Promise,模拟异步获取数据
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve([...Array(size)].map((_, index) => ({
            displayName: `Name ${page * size + index}`,
            phoneNumbers: [`Phone ${page * size + index}`]
          })));
        }, 1000);
      });
    }
    
    // 分批处理联系人
    async function processContacts() {
      let page = 0;
      let hasMore = true;
    
      while (hasMore) {
        const contacts = await fetchContacts(page++, BATCH_SIZE);
        if (contacts.length < BATCH_SIZE) {
          hasMore = false;
        }
        // 处理每批联系人数据
        console.log('Processing contacts:', contacts);
      }
    }
    
    processContacts();
    

    【代码运行方式】:

    • 将上述代码集成到您的uniapp项目中。
    • 确保您的应用有权限访问手机通讯录。
    • 在合适的时机调用processContacts函数。

    【代码预期运行结果】:

    • 应用将不会一次性加载所有联系人,而是分批次进行,每批处理500个联系人。
    • 应用不会因为内存不足而闪退。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月19日

悬赏问题

  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败