2
ダウンロードの%を行う前に、約30MBのJsonをダウンロードして保存する必要があります。だから私はこのコードを実装しました:キャッシュエラーでjsonファイルを保存する
private void downloadAirports()
{
final OkHttpClient mOkHttpClient = new OkHttpClient();
final Request mRequest = new Request.Builder().url(SERVICE_ENDPOINT).build();
Observable.create(new Observable.OnSubscribe<String>()
{
@Override
public void call(Subscriber<? super String> subscriber)
{
try {
InputStream inputStream;
Response response = mOkHttpClient.newCall(mRequest).execute();
if (response.isSuccessful())
{
inputStream = response.body().byteStream();
long len = response.body().contentLength();
Log.d("str",String.valueOf(len));
String progress = "0";
subscriber.onNext(progress);
final int bufferSize = 1024;
flag = false;
final byte[] buffer = new byte[bufferSize];
final StringBuilder out = new StringBuilder();
Reader in = new InputStreamReader(inputStream, "UTF-8");
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
long total = 0;
airp = new ArrayList<AirportObject>();
int count =0;
/*while ((count = inputStream.read(data)) != -1)
{
total += count;
progress = String.valueOf(total * 100/len);
subscriber.onNext(progress);
}*/
while(!flag)
{
count = inputStream.read(buffer);
if (count == -1)
{
progress = "100";
subscriber.onNext(progress);
flag = true;
}
else
{
byteOutStream.write(buffer);
total += count;
progress = String.valueOf(total * 100/len);
subscriber.onNext(progress);
}
}
// byte[] res = byteOutStream.toByteArray();
File jsonFile = new File(getActivity().getCacheDir(), FILE_NAME);
FileOutputStream outStream = new FileOutputStream(jsonFile);
byteOutStream.writeTo(outStream);
byteOutStream.flush();
inputStream.close();
byteOutStream.close();
Log.d("length", String.valueOf(jsonFile.length()));
Log.d("str",String.valueOf(len));
//write the whole data into the file
/* for(int i = 0; i < res.length; i++)
{
outStream.write(res[i]);
}*/
Gson gson = new Gson();
JsonReader reader = new JsonReader(new FileReader(jsonFile));
airp = new ArrayList<>();
reader.beginArray();
while (reader.hasNext())
{
AirportObject airport = gson.fromJson(reader, AirportObject.class);
airp.add(airport);
}
reader.endArray();
reader.close();
}
subscriber.onCompleted();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}).subscribeOn(Schedulers.newThread())
.subscribe(new Subscriber<String>() {
public void onCompleted()
{
Log.wtf("on complete","On complete");
}
@Override
public void onError(Throwable e)
{
e.printStackTrace();
}
@Override
public void onNext(final String progress) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("%",progress);
}
});
}
});
}
を私はこの問題をした:私はコメントに入れたコード(バイト配列とサイクルのために)、それはとても遅いですが、それが動作を使用する場合、私は私がダウンして投稿したコードを使用する場合、私は、ファイルのサイズのログを印刷するときに、私はこのエラーを与える:
な長さは、私がキャッシュ内で作成したファイルの大きさであるD/length: 25767936
D/str: 24672558
、 strはダウンロードの次元です。だから私はMalformedJson
のこのバグでGsonに何かエラーを出します。
このエラーを修正するにはどうすればよいですか?
この答えは[コミュニティのwiki]であるが(https://meta.stackexchange.com/q/ 11740/147573)answer - 何が間違っていたか、そしてこれがあなたの問題を修正した理由の詳細について、自由に編集してください。 – dimo414