2012-02-29 3 views
2

私はアプリケーションを開発しています。最初にJSON形式(たとえば10-20 MB)で多くのデータをダウンロードする予定です。このすべてのデータは、単一のネットワーク要求で転送されます(データが要求ごとに動的に生成される理由)。データを受信したときfllowingコードは(in builder.append())OOM例外がスローされます。Androidアプリケーションから大規模なネットワークリクエストを作成するときにOutOfMemory例外を回避する

public static String readToString(InputStream stream) throws IOException { 
    BufferedReader in = null; 
    StringBuilder builder = new StringBuilder(); 
    in = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 
    char[] buffer = new char[1024]; 
    int read = 0; 
    while ((read = in.read(buffer, 0, 1024)) > 0) { 
     builder.append(buffer, 0, read); 
    } 
    in.close(); 
    return builder.toString(); 
    } 

が、私はこのエラーを回避するために何ができますか?私は一時的なファイルにデータを保存し、それを処理しようと考えています。しかし、それがうまくいくかどうかは分かりません。 もう1つの可能性は、ネットワークI/Oを2つに分割することです。最初の部分は、ダウンロードする必要のあるデータを受信し、2番目の部分は実際にデータをダウンロードします。

アドバイスはありますか?

+0

一時ファイルにデータを保存できます。方法#2については、データが大きい場合でも同じことができます。したがって、良いアプローチは一時ファイルです。 –

+0

ローカルファイルにデータを保存して処理してみてください。良いアイデアだと思います。 – idiottiger

答えて

3

あなたの最初の考えに従ってください - データを一時ファイルに保存してください(sdcardでお願いします。内部ストレージの20MBが大きすぎます)。まず、ダウンロードのために接続を開く必要があります。

InputStream is = URL("your_request_string").openStream(); 

は、次にOutputStreamを開き、新しく作成したファイルを使用してSDカードに

File f = new File(Environment.getExternalStorageDirectory(), "temp.dat"); 

を新しいファイルを作成します。あなたは今、あなたの転送を行うためのコードのこの部分を使用することができます

FileOutputStream = new FileOutputStream(f); 

:API 11のよう

public static void CopyStream(InputStream is, OutputStream os) { 
    final int buffer_size=8192; 
    try 
    { 
     byte[] bytes=new byte[buffer_size]; 
     for(;;) 
     { 
      int count=is.read(bytes, 0, buffer_size); 
      if(count==-1) 
       break; 
      os.write(bytes, 0, count); 
     } 
    } 
    catch(Exception ex){} 
} 
+0

これはすごくいいですが、20MbのJSONファイルを解析している実際の問題は解決していません。 – njzk2

+0

大量のデータを扱うjsonパーサを既に使用していたとします。そうでない場合は、Jacksonを試してみてください。http://jackson.codehaus.org/ – josephus

+0

はい、データのダウンロードに問題はなく、SDCardにファイルとして保存しています。しかし、ファイルを読み込んでSDCardからカスタムクラスのarraylistとして保存すると、outofmemory例外がスローされます。そのための解決策はありますか? –

1

を、全体の大きなを割り当てることなくJSONデータのストリームを読み取るために使用されるhttp://developer.android.com/reference/android/util/JsonReader.htmlがあります文字列。

以前のバージョンでは、イベントベースのストリーム読み取り機能を提供するサードパーティ製のJSONライブラリが大量にありました。

+1

Google gsonをおすすめします:http://code.google.com/p/google-gson/ :-) –