2
我需要下載約30 MB的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
其中lenght是我在高速緩存中創建的文件的尺寸, str是下載的維度。所以我給了Gson一些錯誤MalformedJson
。
我該如何解決這個錯誤?
@ ste9206這個答案是[社區維基(https://meta.stackexchange.com/q/ 11740/147573)答案 - 隨意編輯更多有關錯誤的細節以及爲什麼這會解決您的問題。 – dimo414