Как использовать RxJava вместо LiveData с компонентами архитектуры Android? - PullRequest
0 голосов
/ 11 мая 2018

Примечание. Если вы уже используете такие библиотеки, как RxJava или Agera, вы можете продолжать использовать их вместо LiveData.Но когда вы используете их или другие подходы, убедитесь, что вы правильно обрабатываете жизненный цикл, так что ваши потоки данных останавливаются, когда связанный LifecycleOwner останавливается, а потоки уничтожаются, когда уничтожается LifecycleOwner.Вы также можете добавить артефакт android.arch.lifecycle: реактивные потоки, чтобы использовать LiveData с другой библиотекой реактивных потоков (например, RxJava2).

Вышеприведенный оператор скопирован со страницы разработчика Android. Здесь он указываетесли вы используете RxJava, вам не нужно использовать LiveData. Поскольку оба следуют Observable Patters. Я хотел знать, как использовать RxJava вместо LiveData с вызовом API api rest. Я много пробовал, но не смог найти никакого ответа. Если кто-то мне помогаетв решении этого вопроса это будет здорово.заранее спасибо

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Вы можете использовать эти методы для преобразования Publisher<T> в LiveData<T> и наоборот.

  • LiveDataReactiveStreams.fromPublisher(Publisher<T> publisher) - даст вам LiveData объект

  • LiveDataReactiveStreams.toPublisher(LifecycleOwner lifecycle, LiveData<T> liveData) - даст ваш RxJava Publisher<T> объект ..

Тогда вы можете использовать pub-sub шаблон ипросто subscribe to the publisher.

0 голосов
/ 11 мая 2018

Это простой пример анализа ответа GET с использованием модификации с RX

Предположим, ответ

   {
            "id": "0001",
                "type": "donut",
                "name": "Cake",
                "image": {
            "url": "images/0001.jpg",
                    "width": 200,
                    "height": 200
        },
            "thumbnail": {
            "url": "images/thumbnails/0001.jpg",
                    "width": 32,
                    "height": 32
        }

ApiInterface

 @GET("nestedjson5")
    Observable<NestedJson5Main> nestedJson5();

Изображение

public class Image {

    String url;
    int width;
    int height;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }
}

Класс модели

public class NestedJson5Main {

    String id;
    String type;
    String name;
    Image image;
    Image thumbnail;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Image getImage() {
        return image;
    }

    public void setImage(Image image) {
        this.image = image;
    }

    public Image getThumbnail() {
        return thumbnail;
    }

    public void setThumbnail(Image thumbnail) {
        this.thumbnail = thumbnail;
    }
}

ViewMOdel Class

public class ParsingVm extends BaseObservable {

    Context context;

    ApiInterface mApiInterface;

    public ParsingVm(Context context) {

        this.context = context;
        mApiInterface = AppController.getInstance().getmNetComponent().getApiInterface();

    }

    public Observable<NestedJson5Main> nestedJson5Main() {

        return AppController.getInstance().getmNetComponent().getApiInterface()
                .nestedJson5()
                .subscribeOn(Schedulers.newThread());
    }
    }

ParsingMain

public class ParsingMain extends AppCompatActivity {


    ActivityParsingBinding activityParsingBinding;

    ParsingVm parsingVm;



    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        activityParsingBinding = DataBindingUtil.setContentView(this, R.layout.activity_parsing);

        parsingVm = new ParsingVm(this);

        activityParsingBinding.setParsingVm(parsingVm);

     receivenesteddjson5();

  }

  public void receivenesteddjson5() {



    parsingVm.nestedJson5Main()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(nestedJson5Main -> {

                Log.d(TAG, "receivenesteddjson5: " + nestedJson5Main.getImage().getHeight());
                Log.d(TAG, "receivenesteddjson5: " + nestedJson5Main.getThumbnail().getUrl());

            }, Throwable -> {

                Throwable.printStackTrace();
            });
}


        }

Я добавил простой ответ, на котором создается и затем наблюдается наблюдаемое.

0 голосов
/ 11 мая 2018

Посмотрите на

https://developer.android.com/reference/android/arch/lifecycle/LiveDataReactiveStreams

Flowable реализует интерфейс RxJava Publisher. Вы можете конвертировать LiveData в Flowable и перейти оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...