2011-12-26 14 views
1

私はアップロードするファイルをネットサーバーに使用するコードを使用します。しかしとき> 6Mサイズは、私が質問を解決するために何を行うことができjava.lang.OutOfMemoryErrorファイルをアップロードするOutOfMemoryError

HttpURLConnection conn; 
    URL url = new URL(mServerUrl); 
    conn = (HttpURLConnection) url.openConnection(); 
    conn.setDoOutput(true); 
    conn.setDoInput(true); 
    conn.setUseCaches(false); 
    conn.setRequestMethod("POST"); 
    conn.setRequestProperty("Content-Type", file.getContentType()); 
    conn.setRequestProperty("Connection", "close"); 
    conn.setRequestProperty("Charset", "UTF-8"); 
    conn.connect(); 
    DataOutputStream os = new DataOutputStream(conn.getOutputStream()); 

    int totalSize = 0; 
    byte[] buffer = new byte[1024]; 
    int len = 0; 
    while ((len = file.getInStream().read(buffer, 0, 1024)) != -1) { 

     totalSize += len; 
     WDLog.i("totalSize = " + totalSize); 
     os.write(buffer, 0, len); 

    } 

    file.getInStream().close(); 
    os.flush(); 
    os.close(); 

致命的な例外を投げます? おかげ

logcatに関する情報があります。

12-26 19:35:06.976: D/dalvikvm(8952): GC_FOR_MALLOC freed 36718 objects/1675552 bytes in 53ms 
12-26 19:35:06.976: I/dalvikvm-heap(8952): Forcing collection of SoftReferences for 12580880-byte allocation 
12-26 19:35:07.006: D/dalvikvm(8952): GC_FOR_MALLOC freed 646 objects/47808 bytes in 34ms 
12-26 19:35:07.006: E/dalvikvm-heap(8952): Out of memory on a 12580880-byte allocation. 
12-26 19:35:07.006: I/dalvikvm(8952): "Thread-29" prio=5 tid=8 RUNNABLE 
12-26 19:35:07.006: I/dalvikvm(8952): | group="main" sCount=0 dsCount=0 s=N obj=0x46230978 self=0x30eb98 
12-26 19:35:07.006: I/dalvikvm(8952): | sysTid=8980 nice=0 sched=0/0 cgrp=default handle=3159096 
12-26 19:35:07.016: I/dalvikvm(8952): | schedstat=(5075164776 7730011023 9520) 
12-26 19:35:07.016: I/dalvikvm(8952): at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:~93) 
12-26 19:35:07.016: I/dalvikvm(8952): at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:218) 
12-26 19:35:07.016: I/dalvikvm(8952): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl$DefaultHttpOutputStream.write(HttpURLConnectionImpl.java:750) 
12-26 19:35:07.016: I/dalvikvm(8952): at java.io.DataOutputStream.write(DataOutputStream.java:101) 
12-26 19:35:07.016: I/dalvikvm(8952): at com.amtcmv.upload.UploadImgVidFile.postVid(UploadImgVidFile.java:218) 
12-26 19:35:07.016: I/dalvikvm(8952): at com.amtcmv.upload.UploadImgVidFile.run(UploadImgVidFile.java:95) 
12-26 19:35:07.016: I/dalvikvm(8952): at java.lang.Thread.run(Thread.java:1102) 
12-26 19:35:07.016: E/dalvikvm(8952): Out of memory: Heap Size=19783KB, Allocated=9352KB, Bitmap Size=162KB 
12-26 19:35:07.016: W/dalvikvm(8952): threadid=8: thread exiting with uncaught exception (group=0x400259f8) 
12-26 19:35:07.026: E/AndroidRuntime(8952): FATAL EXCEPTION: Thread-29 
12-26 19:35:07.026: E/AndroidRuntime(8952): java.lang.OutOfMemoryError 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:93) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:218) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl$DefaultHttpOutputStream.write(HttpURLConnectionImpl.java:750) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at java.io.DataOutputStream.write(DataOutputStream.java:101) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at com.amtcmv.upload.UploadImgVidFile.postVid(UploadImgVidFile.java:218) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at com.amtcmv.upload.UploadImgVidFile.run(UploadImgVidFile.java:95) 
12-26 19:35:07.026: E/AndroidRuntime(8952):  at java.lang.Thread.run(Thread.java:1102) 

os.write(バッファ、0、LEN)であり;

この行はエラーをスローします。

+0

Logcatメッセージを投稿できますか?あなたは例外を受けています。 – Karthik

+0

Hi線。ここであなたの答えを加えて詳細を教えてください。私は本当にここに打たれています。 –

答えて

3

チャンクでサーバーにファイルをアップロードするには、チャンクを基準にしてください。例。ファイルのすべてのデータがアップロードされるまで、サーバーからの応答を取得した後、最初に1024バイトのデータをアップロードします。次の1024バイトのデータをアップロードします。

+0

は、私はこのような問題を解決する:(totalSizeは> 5 * 1024 * 1024)抜け出すと( \t \t os.flush()を行う場合にはしばらくサイクルに追加します。 \t \tにos.closeを(); conn.disconnect() ; \t \t System.gc();)ファイルの入力ストリームを閉じないでください。未完了の再実行アップロード機能がある場合 – ray

+0

私は例を与えることができます/ –

1

このコードをエミュレータでテストする場合は、RAMのサイズが実際のデバイスの値に近いことを確認してください。

+0

私はhtc g7の上でそれをテストします – ray

+0

次にチャンクでファイルのチャンクをアップロードしようとすると、Sunil Kumar Sahooが言うように –

関連する問題