0

その情報をJSONとしてダウンロードするAndroidアプリケーションがあります。

典型的なJSONダウンロードは約2,000〜3,000文字です。しかし、私はそれを強調したかったので、より大きなファイル(〜48,000文字)を作成しました。ファイルが進むにつれて、これはまだ小さく、50kb未満です。

私が抱えている問題は、ダウンロード時に16144文字のデータしか取得できないことです。つまりreader.readLine()、と同様に、16144文字を含む1行だけが返されますclient.execute(request, new BasicResponseHandler());。明らかに、ファイルの一部だけでは、JSON解析コードは有効なJSONオブジェクトではないため、すぐに失敗します。

発生する例外はないため、メモリ不足エラーではありません。また、この問題はHTC Desire(2.2)とGalaxy Nexus(4.1.1)でも再現可能であるため、OS固有でもありません。私はWebブラウザでURLをテストしましたが、正常に動作し、すべてのJSONが利用できるため、サーバーエラーではありません。

質問

なぜ16144文字しかダウンロードされないのか、ファイル全体をダウンロードさせる方法を誰かが指摘できますか?

方法#1

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(uri);
HttpResponse response = client.execute(request);

InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
    str.append(line);
}
in.close();
result.setJSONResult(str.toString());

方法#2

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(uri);
HttpResponse response = client.execute(request);

String json = client.execute(request, new BasicResponseHandler());
result.setJSONResult(json);

注-URLはLANネットワーク(http://192.168.0.99:8080 ...)にあるため、役に立たないため、ここには含めませんでした。

更新-修正

問題を修正しました。結局、私はそれを電話のメモリ制限ではなくファイル転送の問題に置きました。PC(Chrome)で動作していましたが、Android以外の場所(Webサイトなど)で壊れていて、他のブラウザー(Safari)が生のAPI呼び出しで動作しなかったことがわかりました。根本的な問題は、Webサーバーのプロキシngixであり、より大きな応答(32kb以上)をバッファリングしたかったのですが、バッファリングに使用したサーバーフォルダーへの書き込み権限がありませんでした。これは、ファイルの一部を送信し、バッファリングを開始し、書き込みができなかったために重大なエラーが発生したことを意味します。エラーが発生すると、ファイルの残りの部分の送信が停止したため、異常なバイト数で停止しました。ご協力ありがとうございます!

4

3 に答える 3

1

これは、文字列が保持できる最大サイズであるためです。Java仕様では常に2147483647(2 ^ 31-1)、文字列クラスが内部ストレージに使用する配列の最大サイズ)、または最大ヒープサイズの半分(以降各文字は2バイト)のいずれか小さい方です。

おそらくヒープサイズは40kbs未満になります

文字列を使用する代わりにjsonリーダーを使用して、Webplsからのデータを保存できます。http://developer.android.com/reference/android/util/JsonReader.htmlを参照してください

于 2012-09-03T10:45:40.227 に答える
0

ラインベースのリーダーを使用して、ラインベースではないデータを読み取っています。を呼び出すときはreadLine、読み取ったものをテキスト行に強制的に変換するように要求しています。これは、実際には1行のテキストではない場合に、データを混乱させます。

于 2012-09-03T10:41:12.643 に答える
0

問題を修正しました。結局、私はそれを電話のメモリ制限ではなくファイル転送の問題に置きました。PC(Chrome)で動作していましたが、Android以外の場所(Webサイトなど)で壊れていて、他のブラウザー(Safari)が生のAPI呼び出しで動作しなかったことがわかりました。根本的な問題は、Webサーバーのプロキシngixであり、より大きな応答(32kb以上)をバッファリングしたかったのですが、バッファリングに使用したサーバーフォルダーへの書き込み権限がありませんでした。これは、ファイルの一部を送信し、バッファリングを開始し、書き込みができなかったために重大なエラーが発生したことを意味します。エラーが発生すると、ファイルの残りの部分の送信が停止したため、異常なバイト数で停止しました。ご協力ありがとうございます!

于 2012-09-07T16:07:35.830 に答える