2016-11-10 4 views
1

Ich habe diesen Code machte diese JSON zum Download:gibt es eine bessere Möglichkeit, diesen Json abzurufen?

private void rxPublishProgress() 
{ 
final OkHttpClient mOkHttpClient = new OkHttpClient(); 

    final Request mRequest = new Request.Builder().url(AirportService.SERVICE_ENDPOINT).build(); 

    Observable.create(new Observable.OnSubscribe<String>() 
    { 
     @Override 
     public void call(Subscriber<? super String> subscriber) 
     { 
      try { 
       InputStream inputStream; 
       okhttp3.Response response = mOkHttpClient.newCall(mRequest).execute(); 
       if (response.isSuccessful()) 
       { 
        inputStream = response.body().byteStream(); 
        long len = response.body().contentLength(); 

        String progress = "0"; 
        subscriber.onNext(progress); 

        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"), 8); 
        StringBuilder sb = new StringBuilder(); 
        byte[] data = new byte[1024]; 
        long total = 0; 
        int count; 
        String line = null; 

        final int bufferSize = 1024; 
        boolean flag = false; 
        JSONObject jsonObject = null; 
        final char[] buffer = new char[bufferSize]; 
        final StringBuilder out = new StringBuilder(); 
        Reader in = new InputStreamReader(inputStream, "UTF-8"); 

        for(;flag ==false ;) 
        { 
         count = in.read(buffer, 0, buffer.length); 

         if (count == -1) 
         { 
          progress = "100"; 
          subscriber.onNext(progress); 
          flag = true; 
         } 
         else 
         { 
          out.append(buffer, 0, count); 
          // Log.d("out",out.toString()); 
          total += count; 
          progress = String.valueOf(total * 100/len); 
          subscriber.onNext(progress); 
         } 
        } 

        inputStream.close(); 

        // try parse the string to a JSON object 
        try 
        { 
         jsonObject = new JSONObject(out.toString()); 
        } 
        catch (JSONException e) 
        { 
        e.printStackTrace(); 
        } 

        Log.d("lengt",String.valueOf(jsonObject.length())); 

        subscriber.onCompleted(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).subscribeOn(Schedulers.newThread()).subscribe(new Subscriber<String>() { 
     @Override 
     public void onCompleted() 
     { 
      Log.d("Complete","complete"); 
     } 

     @Override 
     public void onError(Throwable e) 
     { 
     } 

     @Override 
     public void onNext(final String progress) { 
      getActivity().runOnUiThread(new Runnable() { 
       @Override 
       public void run() 
       { 
       percentage.setText(progress+"%"); 
       } 
      }); 
     } 
    }); 

und es funktioniert, aber ich weiß nicht, wie diese JSON abrufen oder mit Gson zu konvertieren.

Ich muss den Prozentsatz des Downloads abrufen, weil es eine bestimmte Anforderung dieses Projekts ist, aber ich brauche auch das JSONObject oder die Liste. Wie könnte ich das tun?

Dank

+0

Lo0ok in Retrofit 2 - es wird Ihnen sehr helfen, und es unterstützt die GSON-Konvertierung sehr einfach. –

+0

@TassosBassoukos Ich kenne Retrofit2, ich habe eine Version leicht implementiert, aber ich brauche auch einen Prozentsatz des Herunterladens ... – nani

Antwort

0

Wie ich Sie Observable 1 haben und Sie brauchen:

1) Anzeige Prozentsatz

2) etwas anderes tun

So können Sie wie folgt tun:

Observable<okhttp3.Response> responseObservable = Observable.create(/*your code to return response*/) 
    .subscribeOn(Schedulers.newThread()) 
    .replay(1) 
    .refCount(); 

responseObservable 
    .map(toPercents()) 
    .subscribe(displayPercents()); 

responseObservable 
    .map(toSomethingElse()) 
    .subscribe(displaySomethingElse()); 
Verwandte Themen