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

weng4570 发布于 2013/10/14 10:17
阅读 382
收藏 0

报错信息是红色字体报错;根据分析是内存溢出;这个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);
     
}


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

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