2017-01-12 7 views
2

Мне нужно скачать Json около 30 МБ и сохранить его до того, чтобы сделать процент загрузки. Так я реализовал этот код:save json file in cache error

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 - размер загрузки. Поэтому я даю некоторую ошибку в Gson с этой ошибкой MalformedJson.

Как я могу исправить эту ошибку?

ответ

0

Согласно OP, эта строка:

count = inputStream.read(buffer); 

должно быть:

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

@ ste9206 этот ответ является [вики сообщества] (https://meta.stackexchange.com/q/ 11740/147573) ответьте - не стесняйтесь редактировать его с более подробной информацией о том, что было не так, и почему это устранило вашу проблему. – dimo414

 Смежные вопросы

  • Нет связанных вопросов^_^