2017-01-12 15 views
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に何かエラーを出します。

このエラーを修正するにはどうすればよいですか?

答えて

0

OPによると、この行:

count = inputStream.read(buffer); 

は次のようになります。ste9206 @

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

この答えは[コミュニティのwiki]であるが(https://meta.stackexchange.com/q/ 11740/147573)answer - 何が間違っていたか、そしてこれがあなたの問題を修正した理由の詳細について、自由に編集してください。 – dimo414

関連する問題