2017-01-12 68 views
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

我該如何解決這個錯誤?

回答

0

根據OP,這條線:

count = inputStream.read(buffer); 

應該是:

count = inputStream.read(buffer,0,count); 
+0

@ ste9206這個答案是[社區維基(https://meta.stackexchange.com/q/ 11740/147573)答案 - 隨意編輯更多有關錯誤的細節以及爲什麼這會解決您的問題。 – dimo414