内存异常

时间:2013-06-21 07:14:10

标签: android performance out-of-memory

06-21 12:35:37.275: E/AndroidRuntime(12402): FATAL EXCEPTION: Thread-1864
 06-21 12:35:37.275: E/AndroidRuntime(12402): java.lang.OutOfMemoryError
 06-21 12:35:37.275: E/AndroidRuntime(12402):  at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
 06-21 12:35:37.275: E/AndroidRuntime(12402):  at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
 06-21 12:35:37.275: E/AndroidRuntime(12402):  at libcore.net.http.RetryableOutputStream.write(RetryableOutputStream.java:61)
 06-21 12:35:37.275: E/AndroidRuntime(12402):  at java.io.BufferedOutputStream.write(BufferedOutputStream.java:131)
 06-21 12:35:37.275: E/AndroidRuntime(12402):  at java.io.OutputStream.write(OutputStream.java:82)
 06-21 12:35:37.275: E/AndroidRuntime(12402):  at com.facebook.android.Util.openUrl(Util.java:190)
 06-21 12:35:37.275: E/AndroidRuntime(12402):  at com.facebook.android.Facebook.request(Facebook.java:563)
 06-21 12:35:37.275: E/AndroidRuntime(12402):  at dev.env.secvideo.SaveActivity$FBRequestListener.onComplete(SaveActivity.java:467)
 06-21 12:35:37.275: E/AndroidRuntime(12402):  at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:254)

当我尝试从我的app.i上传视频到Facebook时收到此错误消息。我的视频大小约为15-20 MB。我的代码在较低版本中正常运行。我只在4.0以上的更高版本中收到此错误

我正在使用以下代码

public byte[] readBytes(String path) throws IOException {

        InputStream is = new FileInputStream(path);
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(path.length());

        //int bufferSize = 30*1024;
        byte[] buffer = new byte[path.length()];

        int len = 0;
        while ((len = is.read(buffer)) != -1) {
            byteBuffer.write(buffer, 0, len);
        }
        return byteBuffer.toByteArray();
    }
    public class FBRequestListener implements RequestListener
    {

        @Override
        public void onComplete(String response, Object state) {

            byte[] data = null;
            String path = Environment.getExternalStorageDirectory()+"/recordvideooutput.3gp";
            String datapath = new File(path).getAbsolutePath();
            String datamsg = "My Video";
            Bundle params;
            try {
                //InputStream is = new FileInputStream(datapath);
                //data = readBytes(is);
                data = readBytes(datapath);
                params = new Bundle();
                params.putString(Facebook.TOKEN, access_token);
                params.putString("message", datamsg);
                params.putString("contentType", "video/quicktime");
                params.putByteArray("video.mov", data);
                String request = facebook.request("me/videos", params, "POST");
                Log.i("request", request);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onIOException(IOException e, Object state) {


        }

        @Override
        public void onFileNotFoundException(FileNotFoundException e,
                Object state) {


        }

        @Override
        public void onMalformedURLException(MalformedURLException e,
                Object state) {


        }

        @Override
        public void onFacebookError(FacebookError e, Object state) {


        }

    }

3 个答案:

答案 0 :(得分:2)

添加android:largeHeap =" true"在Android Manifest文件中的应用程序标记下。这会增加您可用的可用内存空间。但是,这仅适用于API 11 +。

答案 1 :(得分:0)

基本上,你不能按照你想要的方式去做。因为您正在将整个文件读入内存,所以在进入网络之前,您将耗尽内存。

您可以采取一些方法来帮助解决此问题:

  1. 您可以压缩视频,这意味着可以减小15MB的大小。根据压缩,您应该能够将此文件加载到内存中。但是,这不是保证,您仍然可能遇到问题。

  2. 我检查过Facebook API,看起来他们不支持通过Android SDK支持流媒体数据。这意味着你需要自己动手。他们确实有一个API可以在他们的网站(http://developers.facebook.com/docs/reference/api/video/)上执行此操作,因此您必须弄清楚如何使用该API,然后,一旦您理解它,将您的数据流式传输到他们的Web服务而不是尝试将它全部加载到一个facebook.request对象中。

  3. 这里有一篇博文(http://developers.facebook.com/blog/post/493/),描述了如何将其作为POST请求。具体来说,引用博客

      

    要发布视频,请将视频文件附件的POST请求作为multipart / form-data发送到https://graph-video.facebook.com/me/videos

    有一个PHP示例,您可以从中获取关键部分并转换为Java。

    如果我在你的鞋子里,我会尝试做第二种方法。希望有所帮助。

答案 2 :(得分:0)

有时你需要增加eclipse可用的工作内存,但编辑eclipse目录中的eclipse.ini文件,最后一行,默认值为512m,这意味着只有512mb可以作为eclipse的内存,增加这个你的日食会有更多的公羊。