美文网首页
最简单的使用Retrofit(不结合rxjava和结合rxjav

最简单的使用Retrofit(不结合rxjava和结合rxjav

作者: 番茄tomato | 来源:发表于2019-09-29 15:16 被阅读0次

本例使用的是聚合数据的天气接口
http://apis.juhe.cn/simpleWeather/query
前提准备:
1.添加网络权限

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

2.导入需要的包 如果要结合rxjava 以下六个缺一不可

    //导入retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.6.0'
    //OkHttp3
    implementation 'com.squareup.okhttp3:okhttp:3.12.3'
    //导入rxjava
    implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    //Gson retrofit结合Gson框架作json数据转换
    implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
    //RxJava2 Adapter  retrofit结合rxjava使用的calladapter
    implementation "com.squareup.retrofit2:adapter-rxjava2:2.6.0"

根据以下步骤一步步来:

1.根据服务器返回的json数据建立实体类
使用android studio的GsonFormat插件直接创建即可

2.创建网络请求api接口

public interface APIService {
//这里采用GET注解 关于其他注解的使用方式以后扩展
    @GET("simpleWeather/query")
    Call<WeatherBean> getWeather(@Query("city") String city, @Query("key") String key);
//我们需要在GET请求中加入两个参数city  城市 和key 请求的唯一识别码
}

3.创建retrofit实例 发送请求

    public void getWeather() {
//创建retrofit实例 并传入baseurl和数据转换工厂(使用到了谷歌官方的Gson框架 用于将json数据转化为实体类)
        Retrofit retrofit = new Retrofit
                .Builder()
                .baseUrl("http://apis.juhe.cn/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        
        //创建接口实例
        APIService apiService = retrofit.create(APIService.class);
//对发送请求的url进行封装最终生成网络请求对象
        Call<WeatherBean> call = apiService.getWeather("成都", "***这里是我的key*****");

//使用enqueue发送异步请求 并 回调对ui进行处理展示数据或者其他操作
//onResponse为请求成功后的操作
//onFailure为请求失败后的操作
        call.enqueue(new Callback<WeatherBean>() {
            @Override
            public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
//response为服务器的返回数据 我们需要它 的body是我们转换后的实体类 
//需要实体类中的什么内容根据需要自取
                WeatherBean.ResultBean data = response.body().getResult();
//特别注意非空判断 很容易因为空指针问题导致崩溃
                if(data!=null){textView.setText(data.getCity() + ":" + data.getRealtime().getInfo());}
                else {textView.setText(response.body().getReason());}
            }
            @Override
            public void onFailure(Call<WeatherBean> call, Throwable t) {
//如果发送错误请求错误显示出来
                textView.setText(t.toString());
            }
        });
    }

你可能会遇到的错误(也是我本人遇到的错 保持更新):

  • 程序崩溃 data为null
    此时说明请求成功了,执行了onResponse方法,但是服务器返回的数据中 你使用到的为null 比如我的例子中response.body().getResult()这里获取的result对象 在我们向url请求不存在的城市时 就可能为null
    所以一定要做好非空判断防止程序崩溃,再进一步分析数据为空的原因
  • 请求出错,错误显示为:java.net.UnknownServiceException: CLEARTEXT communication to *** not permit...
    错误原因:
    谷歌最新更新中不允许使用http非加密进行明文传输,只能使用https
    解决办法:
    https://www.jianshu.com/p/53eeb163b19a

以下是补充retrofit结合rxjava的使用
需要修改的地方:
api接口中 我们需要将返回类型修改为Observable<WeatherBean>
我这里新建了一个方法 getWeatherInRxjava

public interface APIService {
    @GET("simpleWeather/query")
    Call<WeatherBean> getWeather(@Query("city") String city, @Query("key") String key);

    @GET("simpleWeather/query")
    Observable<WeatherBean> getWeatherInRxjava(@Query("city") String city, @Query("key") String key);
}

实体类不做修改
然后再需要网络请求的地方:

//retrofit结合rxjava来使用
public void getWeatherInRxjava(){
//创建retrofit对象
    Retrofit retrofit =new Retrofit
            .Builder()
            .baseUrl("http://apis.juhe.cn/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//引入rxjava适配
            .build();
//这里较之以上是简写 其实除了加入rxjava 其他的也是一样的 只是没有把对象单独写出来
    retrofit.create(APIService.class)//实例化网络请求接口
            .getWeatherInRxjava("成都", "19fd22d1c21e46438c7e62f87087e2ef")//调用请求方法
            .subscribeOn(Schedulers.io())//指定在io线程中发出请求
            .observeOn(AndroidSchedulers.mainThread())//指定在主线程中处理请求结果
            .subscribe(new Observer<WeatherBean>() {//声明观察者 来处理请求结果
                @Override
                public void onSubscribe(Disposable d) {//观察者成功订阅请求时

                }

                @Override
                public void onNext(WeatherBean weatherBean) {//请求成功时
                    WeatherBean.ResultBean data = weatherBean.getResult();
                    if(data!=null){textView.setText(data.getCity() + ":" + data.getRealtime().getInfo());}
                    else {textView.setText(weatherBean.getReason());}
                }

                @Override
                public void onError(Throwable e) {//请求出错时
                    textView.setText(e.toString());
                }

                @Override
                public void onComplete() {//请求操作完成后

                }
            });
}

以上就是最简单的retrofit结合rxjava的使用
推荐阅读https://www.jianshu.com/p/464fa025229e

我们可以发现 这getWeatherInRxjava()getWeather()两次请求中有很多共同点,比如创建retrofit对象的过程是完全一致的,其实我们对于相同的baseurl只需要创建一个retrofit就可以了,这里可以将网络请求中,相对比较重复的过程封装起来,以达到清晰代码结构和节省内存的目的,这个过程做到极致就是MVP框架了

相关文章

网友评论

      本文标题:最简单的使用Retrofit(不结合rxjava和结合rxjav

      本文链接:https://www.haomeiwen.com/subject/gcbfpctx.html