RxJava+Retrofit网络请求框架基本用法

背景

当前Android新的框架越来越多,RxJava+Retrofit进行网络请求的框架尤为突出。故本次整合了RxJava+Retrofit进行网络请求最基本的用法。

框架简介

RxJava: 基于观察者模式的,链式调用方式的异步编程框架。
观察者模式,包含观察者(Observer)、被观察者(Observable)。两者之间绑定(subscribe)后即可由观察者去观察被观察者的行为。观察者在察觉到被观察者处理完某些事情后,会进行相应的操作。其优点是会使异步的代码逻辑阅读起来会非常清晰简洁。
RxJava详情请参考大神的文章:RxJava详解
Retrofit: 一个网络请求框架,底层使用了OKHttp框架。其最大的优点对OKHttp框架进行了进一步封装,网络请求逻辑只需要使用正确的注解即可完成,无需写大量代码,结构也更加清晰明了。
Retrofit详情参考另一位大神的文章:Retrofit详解
对于网络请求来说,网络请求模块属于被观察者,其请求网络后,得到的结果由观察者感知到并进行处理。

框架实战

下面,我们来使用MVP+RxJava+Retrofit来做一个查询版本号的Demo。
需要用到的接口:http://ezcloud.uniview.com/android/updatev3.json (可自行打开查看)
上述链接返回一个json字符串。我们需要写一个Demo解析其中一个字段的值(verCode)并打印出来。

首先,我们需要接入RxJava与Retrofit框架。接入方式见上述框架的详解。

其次,我们编写Retrofit网络请求接口(M层):

public interface HttpUtil {

    @GET("/android/updatev3.json")
    Observable queryUpdate();
}

上述代码块,即为Retrofit的网络请求接口,我们只需要写一个接口,加上相应的注解即可,不需要实现它。
其中@GET表示请求为get方式。请求的链接为后面括号中的值(请求链接在初始化Retrofit的时候传入)。
而返回值是一个被观察者: Observable。网络请求的结果是要被观察者观察并处理的。被观察者是一个Json对象。

接下来,我们初始化Retrofit并实现请求网络的逻辑(M层):

public class TestModel {

    public Observable loadVersionInfo() {
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .baseUrl("http://ezcloud.uniview.com")
                .build();
        HttpUtil httpUtil = retrofit.create(HttpUtil.class);
        return httpUtil.queryUpdate();
    }
}

此处,我们创建了一个Retrofit对象,并且为其设置了Gson解码器(通过addConverterFactory)、RxJava适配器(通过addCallAdapterFactory)、请求主地址(通过baseUrl)。最后通过 retrofit.create(HttpUtil.class); httpUtil.queryUpdate();来请求网络并返回结果。

M层我们基本上写好了,接下来我们实现接收到网络数据后的逻辑(P层):

public class TestPresenter {

    private String TAG = "TEST";
    private TestModel testModel;
    private TestView testView;

    public TestPresenter(TestView testView) {
        this.testView = testView;
        testModel = new TestModel();
    }

    public void getVerCode() {
        testModel.loadVersionInfo().subscribe(observer);
    }

    //创建一个观察者
    private Observer observer = new Observer() {

        @Override
        public void onCompleted() {
            Log.e(TAG, "Completed");
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "Error");
            e.printStackTrace();
        }

        @Override
        public void onNext(JsonObject object) {
            JsonObject jsonObject = object.get("data").getAsJsonObject();
            testView.toastMessage("verCode is: " + jsonObject.get("verCode"));
        }
    };
}

这里主要使用了RxJava,我们一共做了两件事情:1、启动网络请求。2、处理网络数据。其中,启动网络请求时,我们将观察者与被观察者绑定到了一起,此时当Retrofit返回了网络数据后,会走到观察者中onNext回调中。(若网络请求异常,或onNext中发生崩溃,则会走到onError中,否则之后会走到onCompleted中)

最后,写出我们的界面(V层):

public class TestActivity extends Activity implements TestView {

    private final String TAG = "TEST";
    private TestPresenter presenter = new TestPresenter(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(){
            @Override
            public void run() {
                super.run();
                presenter.getVerCode();
            }
        }.start();
    }

    @Override
    public void toastMessage(String str) {
        Log.e(TAG,str);
    }
}
public interface TestView {

    void toastMessage(String str);
}

该界面极度清爽,这就是MVP的好处。

总结

RxJava+Retrofit,封装网络请求接口非常容易,并且能满足各种需求,也可以搭配各种其它框架,这也是它流行的原因之一。
此文章仅示例基本用法,深入的用法还需要大家自行钻研

你可能感兴趣的:(Android技术)