2015-09-21 16 views
18

Meine Frage sollte so etwas wie dumm klingen, aber ich spring gerade von Asynktask zu RxJava. Also:Rxjava und Volley Anfragen

ist möglich RxJava beobachtbare mit Volley Anfragen zu verwenden ?, es bedeutet, zukünftige Anforderungen mit.

ich das fragen, weil ein anderer Httpclient wie Nachrüst verwendet RxJava sehr gut, aber persönlich liebe Volley, so ist es möglich?

bearbeiten

Base auf der ersten Antwort, bekomme ich, dass es möglich ist.

Können Sie teilen einige Beispiele zeigen, wie das geht?

+1

ja. Verwenden Sie RequestFuture und Observable.from – njzk2

+1

ok, wenn es möglich ist, wird meine Frage bearbeiten, um einige Probe zu bekommen. In Volley, um den Wert zurückzugeben, verwende ich normalerweise Rückrufe, aber hier habe ich keine Ahnung, wie man das macht. –

+2

Ich versuche gerade zufällig herauszufinden, wie ich das auch machen soll.Ich lese das gerade jetzt: http://code.hootsuite.com/observing-observables-in-mobile-rxjava-for-android/ –

Antwort

11

Schließlich und vielen Dank für Ihre Antwort finde ich eine Lösung, die teilen möchten:

In meinem Fall i Aktivitäten verwenden, aber für Fragment sollte mehr oder weniger gleich.

Und ich möchte o ein JsonObject als Antwort bekommen, aber könnte Ihre benutzerdefinierte Volley-Implementierung sein.

public class MyActivity extends BaseActivityWithoutReloadCustomer implements Observer<JSONObject> 

{ 
private CompositeSubscription mCompositeSubscription = new CompositeSubscription(); 
private Activity act; 

/** 
* @use handle response from future request, in my case JsonObject. 
*/ 
private JSONObject getRouteData() throws ExecutionException, InterruptedException { 
    RequestFuture<JSONObject> future = RequestFuture.newFuture(); 
    String Url=Tools.Get_Domain(act.getApplicationContext(), Global_vars.domain)+ PilotoWs.wsgetRoutesbyUser+ Uri.encode(routeId); 
    final Request.Priority priority= Request.Priority.IMMEDIATE; 
    Estratek_JSONObjectRequest req= new Estratek_JSONObjectRequest(Request.Method.GET, Url,future,future,act,priority); 
    POStreet_controller.getInstance().addToRequestQueue(req); 
    return future.get(); 
} 

/** 
*@use the observable, same type data Jsob Object 
*/ 
public Observable<JSONObject> newGetRouteData() { 
    return Observable.defer(new Func0<Observable<JSONObject>>() { 
     @Override 
     public Observable<JSONObject> call() { 
      Exception exception; 
      try { 
       return Observable.just(getRouteData()); 
      } catch (InterruptedException | ExecutionException e) { 
       Log.e("routes", e.getMessage()); 
       return Observable.error(e); 
      } 
     } 
    }); 
}; 

@Override 
public void onCreate(Bundle instance) { 
    super.onCreate(instance); 
    setContentView(R.layout.yourLayout); 
    act = this; 

    /** 
    * @condition: RxJava future request with volley 
    */ 

    mCompositeSubscription.add(newGetRouteData() 
      .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(this)); 
} 


@Override 
public void onCompleted() { 
    System.out.println("Completed!"); 
} 

@Override 
public void onError(Throwable e) { 
    VolleyError cause = (VolleyError) e.getCause(); 
    String s = new String(cause.networkResponse.data, Charset.forName("UTF-8")); 
    Log.e("adf", s); 
    Log.e("adf", cause.toString()); 
} 

@Override 
public void onNext(JSONObject json) { 
    Log.d("ruta", json.toString()); 
} 

Für mich funktioniert es einfach. Hoffnung hilft jemandem.

bearbeiten Estratek_JSONObjectRequest.java

public class Estratek_JSONObjectRequest extends JsonObjectRequest{ 
Activity Act; 
Priority priority; 

public Estratek_JSONObjectRequest(int method, String url, 
            JSONObject jsonRequest, Listener<JSONObject> listener, 
            ErrorListener errorListener,Activity act, Priority p) { 
    super(method, url, jsonRequest, listener, errorListener); 
    this.Act=act; 
    this.priority=p; 
} 

public Estratek_JSONObjectRequest(int method, String url, 
            Listener<JSONObject> listener, 
            ErrorListener errorListener,Activity act, Priority p) { 
    super(method, url, null, listener, errorListener); 
    this.Act=act; 
    this.priority=p; 
} 

@Override 
public Map<String, String> getHeaders() { 
    HashMap<String, String> headers = new HashMap<String, String>(); 
    headers.put("Content-Type", "application/json; charset=utf-8"); 
    headers.put("Authorization", "Bearer "+Tools.mySomeBearerToken); 
    return headers; 
} 

//it make posible send parameters into the body. 
@Override 
public Priority getPriority(){ 
    return priority; 
} 

protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
    try { 
     String je = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
     if (je.equals("null")){ 
      je="{useInventAverage:0}"; 
      return Response.success(new JSONObject(je), HttpHeaderParser.parseCacheHeaders(response)); 
     } 
     else 
      return Response.success(new JSONObject(je), HttpHeaderParser.parseCacheHeaders(response)); 
    } catch (UnsupportedEncodingException var3) { 
     return Response.error(new ParseError(var3)); 
    } catch (JSONException var4) { 
     return Response.error(new ParseError(var4)); 
    } 
} 

}

Das ist wie Volley Bauer, aber ich meine eigene benutzerdefinierte machen, einige Header zu senden, wie Inhaber Token, content-type , Sendepriorität, etc. Sonst ist

+1

Könnten Sie 'Estratek_JSONObjectRequest' posten? oder irgendeine generische Form davon? –

+0

Ich habe gerade einige Momente hinzugefügt –

+0

Was bedeutet "je" in 'parseNetworkResponse'? Ist das nur etwas Spezifisches für Ihre Daten? –

5

Gute Nachrichten ist das Mr.张涛 kymjs hat Google Volley in RxVolley geändert, die Unterstützung von HttpClient und RxJava wurde entfernt.

RxVolley = Volley + RxJava + OkHttp

komplette verfügbare Dokumentation bei http://rxvolley.mydoc.io/

PS: ich zur Zeit daran, wie für mehr benutzerdefinierten JSON RxVolley mit Unterstützung verwenden Konverter wie Retrofit!

+1

Dank zu teilen, dass –

+0

ein weiteres ein wenig mehr erweiterte Version einschließlich Konverter ist auch jus: https://github.com/apptik/jus – djodjo

+0

@djodjo Vielen Dank für die Weitergabe! –