2014-06-26 45 views
-1

我正在尝试读取文件并将其上载到服务器,大小为1 MB。它工作正常高达13 MB,但之后,它给我OutOfMemory异常。我已经检查过缓冲区,它总是有1MB的大小,但我不知道它为什么会进入异常。 1件事我预测,以前的读取字节没有立即得到免费的系统,所以我试图找到一些方法来释放它,但没有任何方法与字节[]释放。OutOfMemory错误,同时在Android中创建大文件的块

ByteArrayOutputStream byteBuffer = null; 
      try { 
       byteBuffer = new ByteArrayOutputStream(); 
       byte[] buffer = new byte[maxchunksize]; 
       int len = 0; 
       int startpoint = 0; 
       while ((len = is.read(buffer)) != -1) { 
        Log.i("Upload Chunk",""+buffer.length); 
        byteBuffer.write(buffer, 0, len); 
        String uploadresponse = UploadChunk(fileHandle, buffer, startpoint, EmailID); 
        if(!uploadresponse.equals("Chunk Added")) 
        { 
         Log.e("Upload Chunk", "something went wrong. Aborting upload"); 
         break; 
        } 
        startpoint += buffer.length; 

       } 

任何人都可以帮助我解决这个问题吗?我的文件最大大小是25MB。

这是我得到的例外。

06-26 22:49:22.329: E/AndroidRuntime(15645): java.lang.OutOfMemoryError 
06-26 22:49:22.329: E/AndroidRuntime(15645): at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91) 
06-26 22:49:22.329: E/AndroidRuntime(15645): at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201) 
06-26 22:49:22.329: E/AndroidRuntime(15645): at com.desiengineer.backgroundtask.EvidenceUploadService.onHandleIntent(EvidenceUploadService.java:101) 
06-26 22:49:22.329: E/AndroidRuntime(15645): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
06-26 22:49:22.329: E/AndroidRuntime(15645): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-26 22:49:22.329: E/AndroidRuntime(15645): at android.os.Looper.loop(Looper.java:137) 
06-26 22:49:22.329: E/AndroidRuntime(15645): at android.os.HandlerThread.run(HandlerThread.java:60) 
+0

你在UI线程上做它吗? –

+0

不,它在IntentService上。 – user2376920

+0

我猜你是在'onHandleIntent'中弹出'InternService'创建的当前线程的堆栈内存(注意这里是:'06-26 22:49:22.329:E/AndroidRuntime(15645):at java.io.ByteArrayOutputStream.write (ByteArrayOutputStream.java:201)')。尝试调试以测试您的缓冲区逻辑是否正确。 –

回答

0

删除ByteArrayOutputStream。你没有使用它,它是你的记忆问题的根源。

+0

感谢您的回答,但我想出了它,而你张贴答案。 ;) 非常感谢。 – user2376920

0

你必须对你的代码更改为:

while ((len = is.read(buffer)) != -1) { 
    Log.i("Upload Chunk",""+buffer.length); 
    byteBuffer.write(buffer, 0, len); 
    String uploadresponse = UploadChunk(fileHandle, buffer, startpoint, EmailID); 
    if(!uploadresponse.equals("Chunk Added")) 
    { 
     Log.e("Upload Chunk", "something went wrong. Aborting upload"); 
     break; 
    } 
    startpoint += buffer.length; 
    byteBuffer.reset(); 
} 

没有byteBuffer.reset()的缓冲区仍在不断扩大,并导致OutOfMemoryException异常。

+0

我的缓冲区工作得很好。我所做的错误是增加了'ByteArrayOutputStream'而我没有使用它。 – user2376920

+0

啊!我预计ByteArrayOutputStream有一些原因可能与代码的其他部分有关。 –

相关问题