RxJava+Retrofit上手

    xiaoxiao2021-04-13  31

    本篇讲述RxJava+retrofit相结合的案例应用。 关于retrofit的介绍参见我的前一篇文章:Retrofit用法(一)快速入门,本篇介绍的是结合RxJava之后的写法与应用演示。

    如果你对RxJava还不太了解,没关系,看完本篇文章的demo再去看大神们的详细介绍,理解效果更佳。

    最近几天专注学习了下Rxjava与retrofit的几篇文章,刚开始确实有点懵逼,不过随着案例的介入,思路也 逐渐清晰了起来,这里做下笔记,力求用最简单的案例最少的代码说明问题。

    还是简单说明下Rxjava,可以理解为就是一种异步机制,类似handler,AsyncTask ,不过远比后两者强大的多,异步操作很重要的一点就是程序的简洁性,而面对复杂的任务调度,安卓的异步机制会使代码既难写又难懂,而Rxjava的优势在于,随着代码逻辑的越来越复杂,它依然能保持简洁。 其内部原理是基于一种拓展的观察者模式来实现的。 我们熟知的普通的观察者模式有Button的onclickListener:

    对于RxJava是这样的:在Rxjava里有这样几个概念:订阅subscribe(),观察者observer,被观察者obervable,以及触发的事件。道理很简单,就像EventBus的使用。不过对于Rxjava,onNext()执行完后才会执行onComplete(),这是对于正常事件流程而言,如果onNext()执行过程出现异常,会走onError,而不会执行onComplete()方法了。 好了,原理性的东西就介绍这么多,下面从实例代码来学习具体的用法。 1.添加项目依赖

    compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.retrofit2:retrofit:2.0.0' compile 'com.squareup.retrofit2:converter-gson:2.0.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0' compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.jakewharton:butterknife:7.0.1' compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'

    2.写请求服务接口类SampleApi.java

    package com.practice.dev.rxjavasample.network.api; import com.practice.dev.rxjavasample.model.SampleBean; import java.util.List; import retrofit2.http.GET; import retrofit2.http.Query; import rx.Observable; /** * Created by HY on 2017/4/13. */ public interface SampleApi { @GET("search") Observable<List<SampleBean>> search(@Query("q") String query); }

    3.请求方法写到一个NetWork.java文件中。

    package com.practice.dev.rxjavasample.network; import com.practice.dev.rxjavasample.network.api.SampleApi; import okhttp3.OkHttpClient; import retrofit2.CallAdapter; import retrofit2.Converter; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by HY on 2017/4/13. */ public class NetWork { private static SampleApi sampleApi; private static OkHttpClient okHttpClient = new OkHttpClient(); private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create(); private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJavaCallAdapterFactory.create(); public static SampleApi getZhuangbiApi() { if (sampleApi == null) { Retrofit retrofit = new Retrofit.Builder() .client(okHttpClient) .baseUrl("http://www.zhuangbi.info/") .addConverterFactory(gsonConverterFactory) .addCallAdapterFactory(rxJavaCallAdapterFactory) .build(); sampleApi = retrofit.create(SampleApi.class); } return sampleApi; } }

    4.返回结果的bean类:

    package com.practice.dev.rxjavasample.model; /** * Created by HY on 2017/4/13. */ public class SampleBean { public String description; public String image_url; }

    5.最后是MainActivity的代码:

    package com.practice.dev.rxjavasample; import android.net.Network; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ListView; import com.practice.dev.rxjavasample.model.SampleBean; import com.practice.dev.rxjavasample.network.NetWork; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; import rx.Observer; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class MainActivity extends BaseActivity implements View.OnClickListener { @Bind(R.id.piclist) ListView piclist; @Bind(R.id.search) Button search; private Subscription subscription; private ListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); search.setOnClickListener(this); adapter = new ListAdapter(this); piclist.setAdapter(adapter); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.search: show("可爱"); break; } } private void show(String key) { unsubscribe(); adapter.setImage(null); subscription = NetWork.getZhuangbiApi() .search(key) .subscribeOn(Schedulers.io())//执行网络操作的线程 .observeOn(AndroidSchedulers.mainThread())//执行更新UI的线程 .subscribe(new Observer<List<SampleBean>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(List<SampleBean> sampleBean) { adapter.setImage(sampleBean); } }); } }

    好啦,完整demo在这里下载:https://github.com/hiliving/RxJavaSample

    转载请注明原文地址: https://ju.6miu.com/read-669357.html

    最新回复(0)