3

stringbuilder にループする asynctask でメモリ不足エラーが発生しています。これを使用してサーバーから画像をダウンロードし、SDカード内に保存するための私のターゲット。以下のような私のコード:

HttpClient httpclient = new DefaultHttpClient();
        httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);   
        HttpPost httppost = new HttpPost(severPath);        

        httppost.setEntity(params[0]);
        System.out.println("executing request " + httppost.getRequestLine());



            HttpResponse response = null;
            try {
                response = httpclient.execute(httppost);
            } catch (ClientProtocolException e6) {
                // TODO Auto-generated catch block
                e6.printStackTrace();
            } catch (IOException e6) {
                // TODO Auto-generated catch block
                e6.printStackTrace();
            }
            String output;
            System.out.println("Output from Server .... \n");

            BufferedReader br = null;
            try {
                br = new BufferedReader(
                        new InputStreamReader((response.getEntity().getContent())));
            } catch (IllegalStateException e5) {
                // TODO Auto-generated catch block
                e5.printStackTrace();
            } catch (IOException e5) {
                // TODO Auto-generated catch block
                e5.printStackTrace();
            }

             OutputStreamWriter outputStreamWriter = null;
            try {
                outputStreamWriter = new OutputStreamWriter(context.openFileOutput("LargeImages.txt", context.MODE_PRIVATE));
            } catch (FileNotFoundException e6) {
                // TODO Auto-generated catch block
                e6.printStackTrace();
            }
            int i = 0;


            StringBuilder builder = new StringBuilder();


            String Result = "";
                try {
                    for (String line = null; (line = br.readLine()) != null ; ) {
                                        builder.append(line.toString());

                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }




                    outputStreamWriter.close();

私はメモリ割り当てエラーから抜け出しています。助けてください。私は多くの方法を試していますが、正しくもありません。

4

3 に答える 3

0

実際に出力ストリームに書き込んでいるコードが表示されません。みたいな感じで、閉店前に列を作ってはいけませんoutputStreamWriter.print(builder)か?

ご質問について。StringBuilder でメモリ内のデータ全体を収集して一度に書き込むのではなく、for ループ内で取得した各行を直接書き込む必要があります。StringBuilder はまったく必要ありません。コード スニペットを次に示します。

            try {
                for (String line = br.readLine(); line != null; line = br.readLine()) {
                    outputStreamWriter.append(line);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return;
            }

さらに 3 つの注意事項:

  • 例外を取得した場合は、メソッドから戻るなど、アクションも停止する必要があります。上記のコードは Stacktrace を出力します (これは間違いなく役に立ちます) が、その後続行されますが、あまり役に立ちません。returnそれぞれの後に追加するだけprintstackTraceです。
  • 1 行がメモリに対して長すぎる可能性はまだありますが、リスクは最小限に抑えられます。
  • ダウンロードするデータはバイナリ イメージですか、それともテキストですか。画像と名付けますが、テキストをダウンロードします。バイトと文字 (文字セットでエンコードされたもの) には違いがあることに注意し、実際に受け取る範囲内にとどめてください。
于 2013-10-01T05:33:23.320 に答える
0

画像をダウンロードする場合は、そのReader/Writer/StringBuilderコンテンツを保存するために使用しないでください。ファイルはバイナリ コンテンツであるため、クラスcharacter encodingによって使用されるため、コンテンツがスクランブルされます。Reader/Writer

InputStream/OutputStreamコンテンツをメモリに保存せずに、sdcard に直接使用して保存してみてください。

以下のコードを試してください。

InputStream in = response.getEntity().getContent();
OutputStream out = context.openFileOutput("LargeImages.txt", context.MODE_PRIVATE);
byte b[] = new byte[4096];
int i;
while ((i = in.read(b)) >= 0) {
    out.write(b, 0, i);
}
于 2013-10-01T05:31:46.767 に答える
0

2 つの問題が考えられます。1 つ目 - サイクルfor (String line = null; (line = br.readLine()) != null ; )が正しく終了していません。小さなファイル (合計 10 行など) を開いて確認してみてください。

2 つ目は、実際にはメモリ不足のケースです。画像は非常に重い可能性があり、多くの文字列を作成すると自然なメモリエラーが発生する可能性があるため、文字列を介して画像を取得することはおそらく最良のアイデアではありません。別のアプローチを見つけてみてください。

于 2013-10-01T05:31:12.590 に答える