Android中网络请求框架 Retrofit2 和 RxJava(观察者设计模式)

Retrofit2 && RxJava

1.简介

当前网络开源库有很多,比如Volley,Okhttp ,retrofit等,这些库在目前是比较火的网络请求框架,下面简单看看三种框架的基本用法

1.Volley无参请求


        RequestQueue mRequestQueue = Volley.newRequestQueue(this);
        JsonObjectRequest req = new JsonObjectRequest(url, null,
                new Response.Listener<JSONObject>() {
    
    
                    @Override
                    public void onResponse(JSONObject response) {
    
    
                        /*
                            请求成功走的方法
                         */
                    }
                }, new Response.ErrorListener() {
    
    
            @Override
            public void onErrorResponse(VolleyError error) {
    
    
                  /*
                      请求失败走的方法
                  */
                Log.e("onResponse: ", "error");
            }
        });
        mRequestQueue.add(req);

2.Volley带参请求

Map<String, String> params = new HashMap<String, String>();
params.put("username", "root");
params.put("password", "123456");

JsonObjectRequest newMissRequest = new JsonObjectRequest(
    Request.Method.POST //请求方式
    , "http://127.0.0.1:8080/login", //请求地址
   	  new JSONObject(params) //携带参数
    , new Response.Listener<JSONObject>{
    
    
				//成功方法
				...
			}  
     ,new Response.ErrorListener(){
    
    
			    //失败方法
			}); 

3.Okhttp无参请求:

 new OkHttpClient()
                .newCall(new Request.Builder()
                        .get() 		//默认是get请求 可以不写
                        .url(url)
                        .build())
                .enqueue(new Callback() {
    
    
                    @Override
                    public void onFailure(@NotNull Call call, @NotNull IOException e) {
    
    
                            //失败的方法
                    }

                    @Override
                    public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
    
    
                    //成功的方法
                    }       
                });

4.Okhttp带参请求:

      new OkHttpClient()
                .newCall(new Request.Builder()
                        .url(url)
                        .post
                        (
                         new FormBody.Builder()  //post请求
                        .add("root","root") //参数1
                        .add("password","123456")//参数2
                        .build()
                        )
                .enqueue(new Callback() {
    
    
                    @Override
                    public void onFailure(@NotNull Call call, @NotNull IOException e) {
    
    
                            //失败的方法
                    }

                    @Override
                    public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
    
    
                    //成功的方法
                    }       
                });

2.基本使用

1)、依赖导入

         //Retrofit(网络请求框架)
        //RxJava
        implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
        implementation 'io.reactivex.rxjava3:rxjava:3.0.0-RC7'
        implementation 'com.squareup.retrofit2:adapter-rxjava2:2.7.1'
        //Retrofit
        implementation 'com.squareup.retrofit2:retrofit:2.7.1'
        implementation 'com.squareup.retrofit2:converter-gson:2.7.1'
        //rxlifecycle
        implementation 'com.trello.rxlifecycle3:rxlifecycle:3.1.0'
        implementation 'com.trello.rxlifecycle3:rxlifecycle-android:3.1.0'
        implementation 'com.trello.rxlifecycle3:rxlifecycle-components:3.1.0'
        //Retrofit动态设置baseUrl
        implementation 'me.jessyan:retrofit-url-manager:1.4.0'
        implementation 'androidx.cardview:cardview:1.0.0'

2)、简单介绍相关注解API(前后端约定RESTFul API用起来比较舒适~)

注解 描述
@POST 发送POST请求
@GET 发送get请求
@PUT 发送put请求
@DELETE 发送DELETE请求
@Field 发送带参请求时携带的参数(与@FormUrlEncoded一齐使用)
@FormUrlEncoded 标识表单数据请求(配合@Field一齐使用)
@FieldMap 通过键值对封装参数
@Url 拼接地址
@Path 用于传入占位符的参数

3)、搭建ApiService (用于定义自己需要发送的方法以及对象)

public interface ApiService {
    
    

    @POST
    Observable<LoginUser> findAll(@Url String url); //查询所有用户信息

	@POST("login")
    @FormUrlEncoded
    Observable<ResponseBody> deleteUserAppointment(@Field("id") Integer id,@Field("pwd") String pwd);
    //登录方法	

}

4)、搭建RetrofitUtils(生成工具类配合RxJAVA使用)

 public class RetrofitUtils {
    
    
        private static ApiService apiService;
			//单例模式
        public static ApiService getApiService() {
    
    
            if (apiService == null) {
    
    
                synchronized (RetrofitUtils.class) {
    
    
                    if (apiService == null) {
    
    
                        apiService = getRetrofit().create(ApiService.class);
                    }
                }
            }
            return apiService;
        }

得到Retrofit

        public static Retrofit getRetrofit() {
    
    
            return new Retrofit.Builder()
                    .baseUrl(Constants.url) //动态设置url http://127.0.0.1/
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //RxJAVA适配器
                    .addConverterFactory(GsonConverterFactory.create()) //Gson转换工厂
                    .client(getClient()) //设置客户端 打印日志信息
                    .build();
        }

添加拦截器

        private static OkHttpClient getClient() {
    
    
            return new OkHttpClient.Builder()
                    .addInterceptor(Objects.requireNonNull(getInterceptor())) //添加拦截器
                    .build();
        }

        private static Interceptor getInterceptor() {
    
    
            HttpLoggingInterceptor.Level level = HttpLoggingInterceptor.Level.BODY;
            HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
    
    
                @Override
                public void log(String message) {
    
    
                    Log.i("请求参数信息:", message);
                }
            });
            interceptor.setLevel(level);
            return interceptor;
        }

5)、搭建RxJAVA配合RetrofitUtils使用

[ 1 ].方法说明

方法 主要作用
Observable< T> subscribeOn(Scheduler scheduler) 用于开启子线程发送网路请求
< R> Observable< R> compose (ObservableTransformer<? super T, ? extends R> composer) 用于绑定生命周期(但是需要继承RxAppCompatActivity类)
Observable< T> repeatWhen(final Function<? super Observable< Object>, ? extends ObservableSource<?>> handler) 带条件的重复执行函数
Observable< R> map(Function<? super T, ? extends R> mapper) 可以将被观察者转换为其他任意类型
Observable< T> observeOn(Scheduler scheduler) 切换线程,在主线程中接受数据
void subscribe(Observer<? super T> observer) 订阅(一般写在最后 需要重写四个方法
【onSubscribe , onNext(处理数据)
,onError,onComplete】)

[ 2 ].简单demo实现 Retrofit2 && RxJava 使用

补充:在实现Observer< T > 接口时,会重写四个方法,但是我们在中小型网络请求时,可能只会关心成功(onNext)和失败(onError)的方法,于是小编定义BaseObserver< T >类实现接口,自定义成功和失败方法:

public abstract class BaseObserver<T> implements Observer<T> {
    
    

    protected abstract void onSuccess(T t);

    protected abstract void onFailed(Throwable e);

    @Override
    public void onSubscribe(Disposable d) {
    
    
    }

    @Override
    public void onNext(T t) {
    
    
        onSuccess(t);
    }

    @Override
    public void onError(Throwable e) {
    
    
        onFailed(e);
    }

    @Override
    public void onComplete() {
    
    

    }

}

被观察者订阅链:调用ApiService中的findAll()方法

      RetrofitUtils.getApiService()
                .findAll()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new BaseObserver<LoginUser>() {
    
    
                    @Override
                    protected void onSuccess(LoginUser loginUser) {
    
    
                    	//此时是以及回到主线程了,可以对返回的数据进行直接使用了
                    			...
                    }

                    @Override
                    protected void onFailed(Throwable e) {
    
    
                     	 //失败
                  			...
                    }
                 }
        

另外:RxJAVA有很多的操作符,还有很多需要我们大家一起去学习和挖掘的地方,在不断的学习和完善后,再继续完善框架的使用

猜你喜欢

转载自blog.csdn.net/weixin_43409994/article/details/110750713