工作网络

Android Rxjava-Retrofit-Okhttp三剑

2019-11-08  本文已影响0人  KenChen_939

参考:http://gank.io/post/560e15be2dca930e00da1083
(本文部分内容取自该文章)

介绍Rxjava

GitHub主页上的介绍:
a library for composing asynchronous and event-based programs using observable sequences for the Java VM
(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)

他是一个异步操作的库,让代码变得更加简洁

观察者模式

首先介绍一下观察者模式:

举一个栗子:Android常用的Button和他的点击事件
他们的角色如下:

那么在Rxjava里我们也将角色进行一下分配:

1:观察者Observer:他决定被观察者在触发的时候会执行什么操作,在Rxjava里回调事件有很多个,比如onNext();(类似于OnClick事件),还有几个特殊的回调事件:

2:被观察者: observable: 它决定什么时候触发事件以及触发怎样的事件。
3:订阅subscribe(): 创建了Observable和Observer之后,再用subscribe()方法将它们联结起来

使用Rxjava

implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
Observable observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onComplete();
            }
        });

        //创建观察者observer
      Obsercer  observer = new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d("chen", "subscribe");
            }

            @Override
            public void onNext(Integer value) {
                Log.d("chen", value.toString());
                getBlog();
            }

            @Override
            public void onError(Throwable e) {
                Log.d("chen", "error");
            }

            @Override
            public void onComplete() {
                Log.d("chen", "complete");
            }
        };

      observable.subscribe(observer);            //订阅

这样就完成了一次Rxjava的使用

介绍Retrofit

在Android开发中网络请求是非常常见的,而在Android网络请求库中Retrofit是非常好用的一个
需要注意的是Retrofit仅复制网络请求接口的封装,而网络请求的工作本质上是由Okhttp完成的

Retrofit的使用

注解

Retrofit使用大量注解来简化请求,Retrofit将okhttp请求抽象成java接口,使用注解来配置和描述网络请求参数。

注解的使用:

1:使用Get请求:

public interface SimpleDemoApiService {
    @GET("bins/1bcga4")
    Call<ResponseBody>getJereChenBlog();
}

这是一个最简单的Get请求方式,需要在头部添加@GET(" ")注解,括号内填的是URl的部分地址,他的返回类型是Call<***>,***表示接受数据的实体类,如果想获取原始数据可以填写ResponseBody,ResponseBody是请求之后返回的原始数据。
注:retrofit把URL分为了两个地方配置,第一部分在实例化retrofit对象时通过.baseURL();配置,第二部分在注解中配置,两者加起来才是完整的url地址。

retrofit简单使用

添加依赖:

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

在清单文件中添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

创建接收服务器返回数据的类

public class Goods {
    private String name;
    private String price;
    private String image;

    public Goods(String name, String price, String image) {
        this.name = name;
        this.price = price;
        this.image = image;
    }

    public String getName() {
        return name;
    }

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

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getImage() {
        return image;
    }

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

创建网络接口的类

public interface SimpleDemoApiService {
    @GET("bins/1bcga4")
    Call<ResponseBody>getJereChenBlog();
}

创建retrofit实例化的类


public class SimpleDemoApiWrapper {
    private static Retrofit retrofit;
    private static final String BASE_URL = "https://api.myjson.com/";

    public static Retrofit getRetrofitInstance(){

        if (retrofit == null){

            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .readTimeout(30, TimeUnit.SECONDS)
                    .writeTimeout(50,TimeUnit.SECONDS)
                    .connectTimeout(1,TimeUnit.MINUTES)
                    .build();

            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(okHttpClient)
                    .build();
        }

        return retrofit;
    }
}

具体使用

 SimpleDemoApiService simpleDemoApiService = SimpleDemoApiWrapper.getRetrofitInstance().create(SimpleDemoApiService.class);
        simpleDemoApiService.
                getJereChenBlog()
                .enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    String json = response.body().string();
                    Log.d("chen", json);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.d(TAG, "onFailure: ");
            }

        });
上一篇 下一篇

猜你喜欢

热点阅读