Rxjava+Retrofit 观察者模式 请求网络数据简单使用

首先引入依赖

implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'

在写一个接口RetrofitService

//@get 加注解  被观察者observable 选io包的 泛型 responsebody get 括号里加注解网址和查询集合map
@GET
Observable<ResponseBody> get(@Url String url, @QueryMap Map<String,String> map);

@POST
Observable<ResponseBody> post(@Url String url, @QueryMap Map<String,String> map);

在写工具类RetrofitUtils 省略了必须初始化方法更简便

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.ResponseBody;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

public class RetrofitUtils {

private final RetrofitService retrofitService;
private RetrofitListener retrofitListener;

//本类的构造方法

public RetrofitUtils() {
    //new retrofit 返回值 在builder.添加call 适配器工厂括号里传 Rxjava 2工厂 初始化 .baseurl 传域名.build提交
    Retrofit retrofit = new Retrofit.Builder()
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl("域名")
            .build();
    //用retrofit调用初始化  传接口 返回值 提上去
     retrofitService = retrofit.create(RetrofitService.class);
}

//公共的get 方法传调用接口的参数
public RetrofitUtils get(String url, Map<String,String> map){
    //先判断集合为空
    if(map==null){
        //map=new hasmap 泛型为空
        map=new HashMap<>();
    }

    //调用提上去的接口 .get 传两个参数.subscribeon 传大写schedulers.io .subscribeon传安卓schedulers.mainthresd
    //.subscribe 传下面封装的观察者
    retrofitService
            .get(url,map)
            .subscribeOn(Schedulers.io())
            .subscribeOn(AndroidSchedulers.mainThread())
            .subscribe(observer);

    //记得返回this
    return this;
}

//post 复制get 方法 改两个post
//公共的get 方法传调用接口的参数
public RetrofitUtils post(String url, Map<String,String> map){
    //先判断集合为空
    if(map==null){
        //map=new hasmap 泛型为空
        map=new HashMap<>();
    }

    //调用提上去的接口 .get 传两个参数.subscribeon 传大写schedulers.io .subscribeon传安卓schedulers.mainthresd
    //.subscribe 传下面封装的观察者
    retrofitService
            .post(url,map)
            .subscribeOn(Schedulers.io())
            .subscribeOn(AndroidSchedulers.mainThread())
            .subscribe(observer);

    //记得返回this
    return this;
}


//封装观察者 observer 记住io包 new  泛型 responsebody 实现四个方法
private Observer observer=new Observer<ResponseBody>(){

    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(ResponseBody responseBody) {
        //成功方法
        //把传进来的responsebody .小写字符串 先抓异常 后返回值
        try {
            String s = responseBody.string();
            //去下面定义接口
            //调用接口的成功方法 传字符串
            retrofitListener.success(s);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onError(Throwable e) {
        //失败方法
        //把传进来的e.获取信息 返回值
        String message = e.getMessage();
        //调用接口失败方法传字符串
        retrofitListener.fail(message);

    }

    @Override
    public void onComplete() {

    }
};

//接口回调方法
public void result(RetrofitListener retrofitListener){
    //接口返回值 this. 提上去
     this.retrofitListener = retrofitListener;
}

//定义接口
public interface RetrofitListener{
    //定义成功方法传字符串
    void success(String s);
    //定义失败方法传字符串
    void fail(String message);
}
}

最后在主页面调用工具类

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

private String url1="域名后面的网址";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //直接new 工具类 调用
    new RetrofitUtils().get(url1,null).result(new RetrofitUtils.RetrofitListener() {
        @Override
        public void success(String s) {
            //子线程不能更新UI 不能吐司 否则会报错
            //打印log
            Log.d("MainActivity","请求网络成功"+s);
        }

        @Override
        public void fail(String message) {
            //子线程不能更新UI 不能吐司 否则会报错
            //打印log
            Log.d("MainActivity","请求网络失败");
        }
    });
}
}

猜你喜欢

转载自blog.csdn.net/qq_43143884/article/details/83898042