美文网首页Android开发之路
Retrofit + RxJava 之 Android 应用

Retrofit + RxJava 之 Android 应用

作者: 阿敏其人 | 来源:发表于2016-07-31 08:54 被阅读268次

    本文出自 “阿敏其人” 简书博客,转载或引用请注明出处。

    前言,为什么要使用RxJava,因为当异步操作很多的时候,应用RxJava可以让条例更加清晰。
    那么为什么用Retrofit呢?因为Retrofit2之后内置内置okhttp,oh是大势所趋,加上Retrofit和RxJava两者配合起来非常搭,所以要RxJava+Retrofit。

    一、Retrofit的简单使用

    我们就以为一个请求天气的GET请求展开描述,完整的api

    http://apistore.baidu.com/microservice/weather?citypinyin=beijing
    

    请求Json结果:

    {
        "errNum": 0,
        "errMsg": "success",
        "retData": {
            "city": "接口已经停用",
            "pinyin": "apistore.baidu.com",
            "citycode": "000000000",
            "date": "201616-05-12",
            "time": "10:00",
            "postCode": "0000000",
            "longitude": 0,
            "latitude": 0,
            "altitude": "0",
            "weather": "多云",
            "temp": "0",
            "l_tmp": "0",
            "h_tmp": "0",
            "WD": "北风",
            "WS": "接口已经停用,请访问APIStore.baidu.com查找对应接口",
            "sunrise": "00:00",
            "sunset": "00:00"
        }
    }
    

    接口看完了,数据看完了,代码页可以开始了。

    一、1、最简单的Retrofit调用

    gradle引入

        compile 'com.squareup.retrofit2:retrofit:2.1.0'
        compile 'com.squareup.retrofit2:converter-gson:2.1.0'
        compile 'com.google.code.gson:gson:2.7'
    

    弄一个APIServer接口,写上我们的请求方法

    public interface APIService {
        // 发送get请求,光是这段地址肯定不完整,待会我们还在在别的地方补上 baseurl 。 这里直接把后面的请求给写死了(这样肯定不好)
        @GET("/microservice/weather?citypinyin=beijing")
        Call<WeatherBean> getWeather();
        
    }
    

    MainActivity

    public class MainActivity extends AppCompatActivity {
    
        private TextView mTvGetData;
        private TextView mTvResult;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mTvGetData = (TextView) findViewById(R.id.mTvGetData);
            mTvResult = (TextView) findViewById(R.id.mTvResult);
    
            mTvGetData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    getData();
                }
            });
    
        }
    
        private void getData() {
            String baseUrl = "http://apistore.baidu.com/";
    
            // 创建一个  retrofit ,baseUrl必须有
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            // 利用 retrofit 创建一个接口
            APIService apiService = retrofit.create(APIService.class);
            
            // 利用接口创建一个Call对象
            Call<WeatherBean> weatherBeanCall = apiService.getWeather();
    
            // 请求入队,回调请求成功或者失败
            weatherBeanCall.enqueue(new Callback<WeatherBean>() {
                @Override
                public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
                    WeatherBean jo = response.body();
                    System.out.println("请求成功:"+response.body().getRetData().getWeather());
                    mTvResult.setText("请求成功:"+response.body().getRetData().getWeather());
    
                }
    
                @Override
                public void onFailure(Call<WeatherBean> call, Throwable t) {
                    System.out.println("请求失败");
                    mTvResult.setText("请求失败:"+t.toString());
                }
            });
        }
        
    }
    
    image.png

    一、2、传参调用

    我们改变一下APIServer的一点代码

    使用了@Query,后面的 citypinyin 是参数名

    public interface APIService {
        // 发送get请求,光是这段地址肯定不完整,待会我们还在在别的地方补上 baseurl 。 这里直接把后面的请求给写死了(这样肯定不好)
        // 请求还是Get
        @GET("/microservice/weather")
        Call<WeatherBean> getWeather(@Query("citypinyin") String city); // 使用了@Query,后面的 citypinyin 是参数名
    
    }
    

    接着看一下Activity

        private void getData() {
            String baseUrl = "http://apistore.baidu.com/";
    
            // 创建一个  retrofit ,baseUrl必须有
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            // 利用 retrofit 创建一个接口
            APIService apiService = retrofit.create(APIService.class);
    
            // 利用接口创建一个Call对象
            Call<WeatherBean> weatherBeanCall = apiService.getWeather("beijing");
    
            // 请求入队,回调请求成功或者失败
            weatherBeanCall.enqueue(new Callback<WeatherBean>() {
                @Override
                public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
                    WeatherBean jo = response.body();
                    System.out.println("请求成功:"+response.body().getRetData().getWeather());
                    mTvResult.setText("请求成功:"+response.body().getRetData().getWeather());
    
                }
    
                @Override
                public void onFailure(Call<WeatherBean> call, Throwable t) {
                    System.out.println("请求失败");
                    mTvResult.setText("请求失败:"+t.toString());
                }
            });
        }
    

    其实变化的也就是一行代码

     Call<WeatherBean> weatherBeanCall = apiService.getWeather("beijing");
    

    运行效果一致。

    一、3、简单使用三 @Path

    可以参考此文
    [Android] Retrofit 初步使用

    关键如下截图

    image_1am6fr617kjr14tlnprnditc7m.png

    相关文章

      网友评论

        本文标题:Retrofit + RxJava 之 Android 应用

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