获取字节数组时出现OutOfMemory异常

时间:2015-05-25 13:16:16

标签: java android exception memory parse-platform

我需要将视频文件发送到parse.com。 Parse com正在使用byte []。

我从视频文件中获取字节数组,并且它正常工作。当我使用像100 mb这样的巨大视频文件时,它给了我:

05-25 16:27:48.934  23544-23544/com.ray.tapinto E/art﹕ Out of memory: Heap Size=192MB, Allocated=80MB, Capacity=512MB
05-25 16:27:48.934  23544-23544/com.ray.tapinto E/art﹕ Throwing OutOfMemoryError "Failed to allocate a 134215692 byte allocation with 16777120 free bytes and 111MB until OOM"
05-25 16:27:48.934  23544-23544/com.ray.tapinto E/CrashReporting﹕ ParseCrashReporting caught a OutOfMemoryError exception for com.ray.tapinto. Building report.
05-25 16:27:48.944  23544-23544/com.ray.tapinto E/CrashReporting﹕ Handling exception for crash
    java.lang.OutOfMemoryError: Failed to allocate a 134215692 byte allocation with 16777120 free bytes and 111MB until OOM
            at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
            at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
            at com.ray.tapinto.ui.activity.ViewPagerActivity.getBytes(ViewPagerActivity.java:523)
            at com.ray.tapinto.ui.activity.ViewPagerActivity.onActivityResult(ViewPagerActivity.java:494)
            at android.app.Activity.dispatchActivityResult(Activity.java:6163)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3877)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3931)
            at android.app.ActivityThread.access$1300(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1408)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:155)
            at android.app.ActivityThread.main(ActivityThread.java:5721)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

用法:

...
     InputStream iStream = getContentResolver().openInputStream(videoUri);
                    byte[] inputData = getBytes(iStream);
    ....
        private byte[] getBytes(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();
            }

byteBuffer.write(buffer, 0, len);

行崩溃

通过解析保存文件

final ParseFile imageFile = new ParseFile(filename, imageData);

        imageFile.saveInBackground(new SaveCallback() {
            @Override
            public void done(ParseException e) {
                if(e==null){
                }
            }
         }

我发现parse.com只允许发送少于10mb的文件,因此它只能用于存储一些小数据,如网址,缩略图等

3 个答案:

答案 0 :(得分:0)

处理大文件时,一次性将它们加载到内存中并不是一个好习惯。播放视频时,您将从文件流式传输到媒体解码器。在播放之前,请不要将其全部加载到内存中。

答案 1 :(得分:0)

解析时对象文件大小有限制。 对象的大小限制为10MB

  

PFFile

     

PFFile允许您将应用程序文件存储在云中   否则太大或太麻烦,不适合普通的PFObject。   最常见的用例是存储图像,但您也可以使用它   文档,视频,音乐和任何其他二进制数据(最多10个   兆字节)。

了解更多详情The PFFile

答案 2 :(得分:-1)

你需要给你的jvm更多的内存,比如-Xmx512m甚至更多-Xmx1g