Подтвердить что ты не робот

Запросы Rxjava и Volley

Мой вопрос должен звучать как глупо, но я просто прыгаю от Asynktask до RxJava. Итак:

Можно ли использовать RxJava, наблюдаемую с запросами Volley?, это означает, используя будущие запросы.

Я спрашиваю об этом, потому что другой httpClient, такой как retrofit, очень хорошо использует RxJava, но лично любит Volley, так возможно?

Edit

Основываясь на первом ответе, я понимаю, что это возможно.

Не могли бы вы поделиться какой пример показывает, как это сделать?

4b9b3361

Ответ 1

Наконец, спасибо за ваш ответ. Я найду решение, которое хочет поделиться:

В моем случае я использую Activities, но для фрагмента должен быть более или менее равным.

И я хочу, чтобы получить JsonObject в ответ, но может быть вашей пользовательской реализацией Volley.

 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());
}

Для меня это просто работает. Надежда помогает кому-то.

Edit 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));
    }
}

}

Это похоже на конструкторы Volley, но я делаю свой собственный заказ, чтобы отправить некоторые заголовки, такие как маркер-носитель, тип контента, приоритет отправки и т.д. В противном случае, то же самое,

Ответ 2

Хорошая новость заключается в том, что Mr. 张涛 kymjs изменил Google Volley в RxVolley, удалены поддержка HttpClient и RxJava.

RxVolley = Volley + RxJava + OkHttp

Полная документация доступна на http://rxvolley.mydoc.io/

P.S: Я сейчас думаю о том, как использовать RxVolley с поддержкой нескольких настраиваемых JSON-преобразователей, таких как retrofit!