Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 内存不足异常_Android - Fatal编程技术网

Android 内存不足异常

Android 内存不足异常,android,Android,在我的应用程序中,我给FileInputStream类提供视频文件路径,然后我想要它 若要转换为字节数组,但它抛出内存不足异常,请建议我如何转换 我把代码贴在这里,提前谢谢 public byte[] readBytes(InputStream inputStream) throws IOException { ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); int bufferSi

在我的应用程序中,我给FileInputStream类提供视频文件路径,然后我想要它 若要转换为字节数组,但它抛出内存不足异常,请建议我如何转换 我把代码贴在这里,提前谢谢

public byte[] readBytes(InputStream inputStream) throws IOException
{       
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();  
    int bufferSize = 1024;     
    byte[] buffer = new byte[bufferSize];    
    int len = 0;    
    while ((len = inputStream.read(buffer)) != -1) 
    {         
       byteBuffer.write(buffer, 0, len);   
    }       
    return byteBuffer.toByteArray();
}  

看起来很简单,视频文件太大,无法放入内存。您是否100%确定需要将整个文件放在内存中?这通常是一个糟糕的设计概念。

似乎很简单,视频文件太大,无法放入内存。您是否100%确定需要将整个文件放在内存中?这通常是一个糟糕的设计概念。

它失败了,因为在您正在测试的设备上,您可以使用大约20MB的堆。当它失败时,你的应用程序已经使用了13.5MB的内存。当您试图将
ByteArrayOutputStream
转换为
字节数组
时,它试图分配一个新的~7MB大小
字节[]
,但由于内存不足而失败。一种解决方法是通过重用
ByteArrayOutputStream的内部
字节[]
来避免这种新的分配。不幸的是,无法从外部访问它,因此您需要创建自己的方式,如下所示:

首先创建MyByteArrayOutputStream.java

public MyByteArrayOutputStream extends ByteArrayOutputStream {
    @Override
    public synchronized byte[] toByteArray() {
        return buf;
    }
}
在您的代码中:

public byte[] readBytes(InputStream inputStream) throws IOException
{       
    MyByteArrayOutputStream byteBuffer = new MyByteArrayOutputStream(); // note the change!
    int bufferSize = 1024;     
    byte[] buffer = new byte[bufferSize];    
    int len = 0;    
    while ((len = inputStream.read(buffer)) != -1) 
    {         
       byteBuffer.write(buffer, 0, len);   
    }
    inputStream.close(); // hopefully this will release some more memory
    return byteBuffer.toByteArray();
}

请注意,对于大型视频,这仍然会失败。最佳情况下,您应该尝试以较小的块上载大文件。

它失败了,因为在您正在测试的设备上,您可以使用大约20MB的堆。当它失败时,你的应用程序已经使用了13.5MB的内存。当您试图将
ByteArrayOutputStream
转换为
字节数组
时,它试图分配一个新的~7MB大小
字节[]
,但由于内存不足而失败。一种解决方法是通过重用
ByteArrayOutputStream的内部
字节[]
来避免这种新的分配。不幸的是,无法从外部访问它,因此您需要创建自己的方式,如下所示:

首先创建MyByteArrayOutputStream.java

public MyByteArrayOutputStream extends ByteArrayOutputStream {
    @Override
    public synchronized byte[] toByteArray() {
        return buf;
    }
}
在您的代码中:

public byte[] readBytes(InputStream inputStream) throws IOException
{       
    MyByteArrayOutputStream byteBuffer = new MyByteArrayOutputStream(); // note the change!
    int bufferSize = 1024;     
    byte[] buffer = new byte[bufferSize];    
    int len = 0;    
    while ((len = inputStream.read(buffer)) != -1) 
    {         
       byteBuffer.write(buffer, 0, len);   
    }
    inputStream.close(); // hopefully this will release some more memory
    return byteBuffer.toByteArray();
}

请注意,对于大型视频,这仍然会失败。您最好尝试以较小的块上载大文件。

跳过此处的错误日志和代码。。与其下载整个视频文件,不如使用流媒体直播!!此外,我还没有使用DownloadManager,所以我不知道DownloadManager是否处理这种类型的下载,但您可以尝试一下。感谢您的快速回复,该文件没有那么大,只有7MB。显示内存不足的Fowling错误的logcat:Heap Size=13575KB,Allocated=6793KB,Bitmap Size=14KB,Limit=20480KB 12-07 15:39:05.207:error/dalvikvm(5132):额外信息:Footprint=13575KB,Allowed Footprint=13575KB,Trimmed=816KB 12-07 15:39:05.217:error/AndroidRuntime(5132):Thread-10 1 java.lang.outofmemory错误:(Heap Size=13575KB,Allocated=6793KB,Bitmap Size=14KB)12-07 15:39:05.217:ERROR/AndroidRuntime(5132):位于java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)实际上,我的目标是将一段视频从SD卡上传到facebook,因为我正在转换为字节数组。@Rekha请尝试一下我的回答,跳过您的错误日志和代码。.下载整个视频文件,为什么不使用实时流媒体!!而且我还没有使用DownloadManager,所以我不知道DownloadManager是否处理这种类型的下载ot,但您可以尝试一下。感谢快速回复,该文件没有那么大,只有7 mb。logcat显示内存不足的Fowling错误:堆大小=13575KB,分配=6793KB,位图大小=14KB,限制=20480KB 12-07 15:39:05.207:error/dalvikvm(5132):额外信息:Footprint=13575KB,Allowed Footprint=13575KB,Trimmed=816KB 12-07 15:39:05.217:ERROR/AndroidRuntime(5132):Thread-10 1 java.lang.outofmemory错误:(Heap Size=13575KB,Allocated=6793KB,Bitmap Size=14KB)12-07 15:39:05.217:ERROR/AndroidRuntime(5132):at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)实际上,我的目标是从SD卡上传一段视频到facebook,因为我正在转换成字节数组。@Rekha请尝试一下我的答案