开发者社区> 问答> 正文

android 录音功能;内存溢出,怎么处理?报错

报错信息是红色字体报错;根据分析是内存溢出;这个buffer在while (isRecord == true)这个循环里面,有这样的代码        buffer.append(hex.toUpperCase()); 。这将导致buffer会越来越大。如果用户不点击stop录音,那么(isRecord == true将一直为真,导致buffer不断申请内存。最终挂掉;但是就是解决不了问题;求高手;谢谢

如果这个看的不得懂;这里有简单的源码:http://download.csdn.net/download/weng4570/6395583进入就可以下载;非常谢谢各位;小弟再次谢谢了

private  void writeDateTOFile() {   
  byte[] audiodata = new byte[bufferSizeInBytes];
           
        StringBuilder  buffer=new StringBuilder(audiodata.length);
        String hex="";
//        StringBuilder  buffer=new StringBuilder();
       while (isRecord == true) {
//            StringBuilder buffer=null;
            readsize = audioRecord.read(audiodata, 0, bufferSizeInBytes);
            if (AudioRecord.ERROR_INVALID_OPERATION != readsize ) {
                Log.v("Tag", "``````````22222222222````````````");
                for (int i = 0; i < audiodata.length; i++) {
                    hex = Integer.toHexString(audiodata & 0xFF);
                    if (hex.length() == 1) {
                        hex = '0' + hex;
                    }
                                 
                    buffer.append(hex.toUpperCase());      
                    
                }   
//                try {
//                    Thread.sleep(1000);
//                } catch (InterruptedException e) {
//                    // TODO Auto-generated catch block
//                    e.printStackTrace();
//                }
            }
            
        }
//        buffer.reverse();
           
//        try {
//            Thread.sleep(1000);
//           } catch (InterruptedException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//           }
//        pcmwrite(buffer);
        
        
        StringBuffer sb = new StringBuffer(buffer.length());      
        int sc = Integer.parseInt("8000", 16);      
//            String xx = sb_1.toString();
        String xx = buffer.toString();
        
        for (int i = 0; i < xx.length();) {      
            String temp = xx.substring(i, i + 4);   
            // 将传入的参数,转换为 16 进制数
            int tt = Integer.parseInt(temp, 16);      
            if (sc > tt) {      
                sb.append("0");      
            } else {      
                sb.append("1");      
            }      
            i += 4;      
        }      
        
        pcm_write_1(sb);
     
}


录音时间长了就回报图片那样的错误;比如你录几分钟;第一个按钮录音;第三个按钮停止;下面还有源码;谢谢大家

展开
收起
爱吃鱼的程序员 2020-06-22 15:09:24 667 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    不能直接以流的方式写文件么?我没做过android开发,只是建议下。这个应该不能一直放内存的。回复<aclass='referer'target='_blank'>@冷血:在while的循环中;搞很长时间;有时候内存溢出;我今天下午改了改变成了数据丢失回复<aclass='referer'target='_blank'>@weng4570:你pcm_write_1这个方法的调用是否能在上面while循环中,边读数据,边写文件,用多次追加写文件?回复<aclass='referer'target='_blank'>@冷血:java将字符串写入缓冲流;有例子吗;我在网上没有找到;哥们谢谢回复<aclass='referer'target='_blank'>@weng4570:用带缓冲流来写。android就是用java开发的;性质差不多;你的意思是不写缓冲区中;直接写入文件中吗我顶;顶

    2020-06-22 15:09:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Android内存泄漏自动化链路分析组件Probe 立即下载
58同城Android客户端Walle框架演进与实践之路 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载