2016-05-16 2 views
3

У меня есть такие JSON:Правильный способ использования RxJava + Дооснащение 2

{ 
"success":true, 
"data":[ 
    { 
     "id":"29", 
    "name":"\u0420\u0435\u0441\u0442\u043e\u0440\u0430\u0446\u0456\u044f \u0411\u0430\u0447\u0435\u0432\u0441\u044c\u043a\u0438\u0445 \/ Baczewski Restaurant", 
    "street":"\u0432\u0443\u043b. \u0428\u0435\u0432\u0441\u044c\u043a\u0430, 8", 
    "latitude":"49.842292845502", 
    "longitude":"24.029848249565", 
    "image":"https:\/\/i.onthe.io\/j9aocq72r2lfsmoh9.r500x500.01ff9fff.jpg" 
    }, 
    ... 
    ] 
    } 

По его надо Classes (Pojo), созданный со схемой на POJO. Сначала один обеспечивает способ для получения данных из массива data ->

public List<Datum> getData() { 
    return data; 
} 

И второй один является model этих данных.

При использовании только дооснастить 2.0 я выполнить call, разбор каждого object из data массива и добавить его в RecyclerView.Adapter

Call<PlaceList> call = service.list(1, offset, 10); 
call.enqueue(new Callback<PlaceList>() { 
     @Override 
     public void onResponse(Call<PlaceList> call, Response<PlaceList> response) { 
      final int size = response.body().getData().size(); 
      for (int i = 0; i < size; i++) { 
       places.add(response.body().getData().get(i)); 
      } 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        if (offset == 0) 
         // adapter.notifyItemRangeInserted(0, foodDataList.size()); 
         placeRecyclerAdapter.notifyDataSetChanged(); 
        else 
         placeRecyclerAdapter.notifyItemRangeChanged(places.size() - size, places.size()); 
       } 
      }); 

     } 

     @Override 
     public void onFailure(Call<PlaceList> call, Throwable t) { 

     } 
    }); 
    _______________ 

    public interface Places { 
@GET("places.getPlaces") 
Call<PlaceList> list(
     @Query("type") int type, 
     @Query("offset") int offset, 
     @Query("limit") int limit); 
     } 

Так что это обычный способ для меня. Теперь я хочу сделать то же самое, используя RxJava.

Вот мой interface:

public interface Places { 
@GET("places.getPlaces") 
Observable<PlaceList> list(@Query("type") int type, 
          @Query("offset") int offset, 
          @Query("limit") int limit); 
} 

И это, как я выполняю call:

Observable<PlaceList> call = service.list(1, offset, 10); 
    subscription = call.subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<PlaceList>() { 
       @Override 
       public void onCompleted() { 
        System.out.println("onComplete"); 
       } 

       @Override 
       public void onError(Throwable e) { 
        System.out.println("onError"); 
        e.printStackTrace(); 
       } 

       @Override 
       public void onNext(PlaceList data) { 
        placeRecyclerAdapter.addData(data.getData()); 
       } 
      }); 

Да, это работает, но это правильный способ использования Rx? Я попытался сравнить время, необходимое для синтаксического анализа, но не видел заметной разницы. Я только в первый день изучения RxJava, прочитав несколько статей. Итак, каков правильный способ почувствовать силу RxJava?

+0

Это прекрасно. Реальная сила RxJava приходит, когда вы хотите получить данные, сохраните их в db, затем выполните другой сетевой вызов по определенному подмножеству результатов и т. Д. – Jahnold

ответ

0

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

Где использовать? 1. В пользовательских событиях, таких как нажатие кнопки, события клавиш 2. Отвечайте на IO с задержкой. Запись/запись диска/сети 3. События, инициированные аппаратурой/датчиками

Не следует запускать Thread вручную из Observable create.

дооснащения сети вызов с RxJava: Использование Single: Поскольку наш API не будет давать данные в виде кусков или несколько раз. Вместо этого он будет излучать все только одним звонком. Итак, в случае Observable onCompleted() будет следовать, как только onNext() произойдет. Итак, было бы лучше использовать Single для вызова API.

Использование: Всякий раз, когда нам нужно просто обновлять данные на сервере через API, и мы не беспокоимся о том, что должно быть результатом. Мы просто имели в виду, что сервис успешный или нет. В этом случае мы не ожидаем ничего исправить. Поэтому использование Completable рекомендуется в случаях.

Для прогресса просмотра скрыть/показать: Свяжите эти два события с doOnSubscribe() и doFinally(). Это два оператора, поэтому мы можем логически связать их с RxCall.

RxJava Обработка ошибок:

onErrorResumeNext() - инструктирует наблюдаемым излучать последовательность элементов (что является еще одной наблюдаемой), если он обнаруживает ошибку

onErrorReturn() - инструктирует Observable испускать конкретный элемент, когда он сталкивается с ошибкой

onExceptionResumeNext() - инструктирует наблюдаемый продолжать излучающие элементы, после того, как он встречает исключение (но не другой выбор Throwable)

повторных попыток() - если источник Наблюдаемого излучает ошибку, повторно подписать к нему в надежде, что он будет полным без ошибка. Здесь мы также можем передать аргумент за сколько раз повторить попытку. Вроде. повторить (4). Он будет повторять попытку четыре раза, а после этого, если снова произойдет ошибка, произойдет ошибка.

retryWhen() - если источник Наблюдаемые излучает ошибку, передать эту ошибку в другой Observable, чтобы определить, нужно ли переоформить подписку на источник

RxAndroid для View Переплет:

Подумайте Reactive : Мы можем использовать RxJava для всех событий вида, включая событие click, событие прокрутки, событие перетаскивания. Короче говоря, мы можем заменить всех слушателей на наблюдаемые RxJava.

Доступные библиотеки для использования на уровне View: RxBinding, RxSupport-v4, RxAppCompat-v7, RxRecyclerView, RxDesign, RxLeanBack.

RxBinding с MVP: Мы вернемся Наблюдаемым из вида. Этот наблюдаемый будет доставлен в Presenter и будет выполнять подписку в Presenter.

RxAdapter: Мы можем использовать это для события изменения данных в адаптере. Обычно доступен для Android Listview. RxRecyclerView: для событий изменения данных адаптера recycliewiew мы можем использовать это.

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