[Android] Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用

本文是 Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用

本文的目标是用 Retrofit写一个网络请求:

本文以从获取天气预报接口 (具体接口查看上文 免费天气预报接口)为例,讲解 Retrofit2 的使用

废话不多说,开撸

一、添加依赖

在build.gradle文件中添加如下配置

//retrofit2
compile 'com.squareup.retrofit2:retrofit:2.3.0'//导入retrofit
compile 'com.squareup.retrofit2:converter-gson:2.3.0'//转换器,请求结果转换成Model

二、创建Bean

根据接口返回的JSon数据,使用GsonFormat插件自动创建 WeatherBean 文件 (GsonFormat插件 的安装方法和其余插件安装方法并无二致)

1)打开链接http://t.weather.sojson.com/api/weather/city/101030100,然后复制返回的json数据

2)新建WeatherBean.java ,然后 Alt + Delete ,选择GsonFormat,将复制到的JSON数据赋值进去,点击 “确定” 生成 即可

这是我自动生成的文件:

package com.jack.basemvp.bean;

import java.util.List;

/**
 * 由GsonFormat 生成
 */
public class WeatherBean {

    /**
     * time : 2019-04-20 19:11:47
     * cityInfo : {"city":"天津市","cityId":"101030100","parent":"天津","updateTime":"18:32"}
     * date : 20190420
     * message : Success !
     * status : 200
     * data : {"shidu":"46%","pm25":49,"pm10":87,"quality":"良","wendu":"14","ganmao":"极少数敏感人群应减少户外活动","yesterday":{"date":"19","sunrise":"05:32","high":"高温 18.0℃","low":"低温 11.0℃","sunset":"18:51","aqi":58,"ymd":"2019-04-19","week":"星期五","fx":"东南风","fl":"3-4级","type":"阴","notice":"不要被阴云遮挡住好心情"},"forecast":[{"date":"20","sunrise":"05:30","high":"高温 16.0℃","low":"低温 10.0℃","sunset":"18:52","aqi":64,"ymd":"2019-04-20","week":"星期六","fx":"东北风","fl":"<3级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},{"date":"21","sunrise":"05:29","high":"高温 20.0℃","low":"低温 12.0℃","sunset":"18:53","aqi":72,"ymd":"2019-04-21","week":"星期日","fx":"东南风","fl":"3-4级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"22","sunrise":"05:27","high":"高温 26.0℃","low":"低温 16.0℃","sunset":"18:54","aqi":89,"ymd":"2019-04-22","week":"星期一","fx":"南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"23","sunrise":"05:26","high":"高温 26.0℃","low":"低温 16.0℃","sunset":"18:55","aqi":91,"ymd":"2019-04-23","week":"星期二","fx":"南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"24","sunrise":"05:25","high":"高温 22.0℃","low":"低温 12.0℃","sunset":"18:56","aqi":66,"ymd":"2019-04-24","week":"星期三","fx":"东风","fl":"4-5级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"25","sunrise":"05:23","high":"高温 19.0℃","low":"低温 12.0℃","sunset":"18:57","aqi":41,"ymd":"2019-04-25","week":"星期四","fx":"东南风","fl":"<3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"26","sunrise":"05:22","high":"高温 21.0℃","low":"低温 12.0℃","sunset":"18:58","ymd":"2019-04-26","week":"星期五","fx":"东南风","fl":"3-4级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"27","sunrise":"05:21","high":"高温 21.0℃","low":"低温 10.0℃","sunset":"18:59","ymd":"2019-04-27","week":"星期六","fx":"南风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"28","sunrise":"05:19","high":"高温 23.0℃","low":"低温 12.0℃","sunset":"19:00","ymd":"2019-04-28","week":"星期日","fx":"北风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"29","sunrise":"05:18","high":"高温 22.0℃","low":"低温 12.0℃","sunset":"19:01","ymd":"2019-04-29","week":"星期一","fx":"北风","fl":"3-4级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"30","sunrise":"05:17","high":"高温 23.0℃","low":"低温 14.0℃","sunset":"19:02","ymd":"2019-04-30","week":"星期二","fx":"东南风","fl":"3-4级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"01","sunrise":"05:15","high":"高温 24.0℃","low":"低温 16.0℃","sunset":"19:03","ymd":"2019-05-01","week":"星期三","fx":"东南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"02","sunrise":"05:14","high":"高温 25.0℃","low":"低温 15.0℃","sunset":"19:04","ymd":"2019-05-02","week":"星期四","fx":"东南风","fl":"3-4级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"03","sunrise":"05:13","high":"高温 24.0℃","low":"低温 14.0℃","sunset":"19:05","ymd":"2019-05-03","week":"星期五","fx":"西南风","fl":"4-5级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"04","sunrise":"05:12","high":"高温 24.0℃","low":"低温 14.0℃","sunset":"19:06","ymd":"2019-05-04","week":"星期六","fx":"东南风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"}]}
     */

    private String time;
    private CityInfoBean cityInfo;
    private String date;
    private String message;
    private int status;
    private DataBean data;

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public CityInfoBean getCityInfo() {
        return cityInfo;
    }

    public void setCityInfo(CityInfoBean cityInfo) {
        this.cityInfo = cityInfo;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public static class CityInfoBean {
        /**
         * city : 天津市
         * cityId : 101030100
         * parent : 天津
         * updateTime : 18:32
         */

        private String city;
        private String cityId;
        private String parent;
        private String updateTime;

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }

        public String getCityId() {
            return cityId;
        }

        public void setCityId(String cityId) {
            this.cityId = cityId;
        }

        public String getParent() {
            return parent;
        }

        public void setParent(String parent) {
            this.parent = parent;
        }

        public String getUpdateTime() {
            return updateTime;
        }

        public void setUpdateTime(String updateTime) {
            this.updateTime = updateTime;
        }
    }

    public static class DataBean {
        /**
         * shidu : 46%
         * pm25 : 49.0
         * pm10 : 87.0
         * quality : 良
         * wendu : 14
         * ganmao : 极少数敏感人群应减少户外活动
         * yesterday : {"date":"19","sunrise":"05:32","high":"高温 18.0℃","low":"低温 11.0℃","sunset":"18:51","aqi":58,"ymd":"2019-04-19","week":"星期五","fx":"东南风","fl":"3-4级","type":"阴","notice":"不要被阴云遮挡住好心情"}
         * forecast : [{"date":"20","sunrise":"05:30","high":"高温 16.0℃","low":"低温 10.0℃","sunset":"18:52","aqi":64,"ymd":"2019-04-20","week":"星期六","fx":"东北风","fl":"<3级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},{"date":"21","sunrise":"05:29","high":"高温 20.0℃","low":"低温 12.0℃","sunset":"18:53","aqi":72,"ymd":"2019-04-21","week":"星期日","fx":"东南风","fl":"3-4级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"22","sunrise":"05:27","high":"高温 26.0℃","low":"低温 16.0℃","sunset":"18:54","aqi":89,"ymd":"2019-04-22","week":"星期一","fx":"南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"23","sunrise":"05:26","high":"高温 26.0℃","low":"低温 16.0℃","sunset":"18:55","aqi":91,"ymd":"2019-04-23","week":"星期二","fx":"南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"24","sunrise":"05:25","high":"高温 22.0℃","low":"低温 12.0℃","sunset":"18:56","aqi":66,"ymd":"2019-04-24","week":"星期三","fx":"东风","fl":"4-5级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"25","sunrise":"05:23","high":"高温 19.0℃","low":"低温 12.0℃","sunset":"18:57","aqi":41,"ymd":"2019-04-25","week":"星期四","fx":"东南风","fl":"<3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"26","sunrise":"05:22","high":"高温 21.0℃","low":"低温 12.0℃","sunset":"18:58","ymd":"2019-04-26","week":"星期五","fx":"东南风","fl":"3-4级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"27","sunrise":"05:21","high":"高温 21.0℃","low":"低温 10.0℃","sunset":"18:59","ymd":"2019-04-27","week":"星期六","fx":"南风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"28","sunrise":"05:19","high":"高温 23.0℃","low":"低温 12.0℃","sunset":"19:00","ymd":"2019-04-28","week":"星期日","fx":"北风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"29","sunrise":"05:18","high":"高温 22.0℃","low":"低温 12.0℃","sunset":"19:01","ymd":"2019-04-29","week":"星期一","fx":"北风","fl":"3-4级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"30","sunrise":"05:17","high":"高温 23.0℃","low":"低温 14.0℃","sunset":"19:02","ymd":"2019-04-30","week":"星期二","fx":"东南风","fl":"3-4级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"01","sunrise":"05:15","high":"高温 24.0℃","low":"低温 16.0℃","sunset":"19:03","ymd":"2019-05-01","week":"星期三","fx":"东南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"02","sunrise":"05:14","high":"高温 25.0℃","low":"低温 15.0℃","sunset":"19:04","ymd":"2019-05-02","week":"星期四","fx":"东南风","fl":"3-4级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"03","sunrise":"05:13","high":"高温 24.0℃","low":"低温 14.0℃","sunset":"19:05","ymd":"2019-05-03","week":"星期五","fx":"西南风","fl":"4-5级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"04","sunrise":"05:12","high":"高温 24.0℃","low":"低温 14.0℃","sunset":"19:06","ymd":"2019-05-04","week":"星期六","fx":"东南风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"}]
         */

        private String shidu;
        private double pm25;
        private double pm10;
        private String quality;
        private String wendu;
        private String ganmao;
        private YesterdayBean yesterday;
        private List<ForecastBean> forecast;

        public String getShidu() {
            return shidu;
        }

        public void setShidu(String shidu) {
            this.shidu = shidu;
        }

        public double getPm25() {
            return pm25;
        }

        public void setPm25(double pm25) {
            this.pm25 = pm25;
        }

        public double getPm10() {
            return pm10;
        }

        public void setPm10(double pm10) {
            this.pm10 = pm10;
        }

        public String getQuality() {
            return quality;
        }

        public void setQuality(String quality) {
            this.quality = quality;
        }

        public String getWendu() {
            return wendu;
        }

        public void setWendu(String wendu) {
            this.wendu = wendu;
        }

        public String getGanmao() {
            return ganmao;
        }

        public void setGanmao(String ganmao) {
            this.ganmao = ganmao;
        }

        public YesterdayBean getYesterday() {
            return yesterday;
        }

        public void setYesterday(YesterdayBean yesterday) {
            this.yesterday = yesterday;
        }

        public List<ForecastBean> getForecast() {
            return forecast;
        }

        public void setForecast(List<ForecastBean> forecast) {
            this.forecast = forecast;
        }

        public static class YesterdayBean {
            /**
             * date : 19
             * sunrise : 05:32
             * high : 高温 18.0℃
             * low : 低温 11.0℃
             * sunset : 18:51
             * aqi : 58.0
             * ymd : 2019-04-19
             * week : 星期五
             * fx : 东南风
             * fl : 3-4级
             * type : 阴
             * notice : 不要被阴云遮挡住好心情
             */

            private String date;
            private String sunrise;
            private String high;
            private String low;
            private String sunset;
            private double aqi;
            private String ymd;
            private String week;
            private String fx;
            private String fl;
            private String type;
            private String notice;

            public String getDate() {
                return date;
            }

            public void setDate(String date) {
                this.date = date;
            }

            public String getSunrise() {
                return sunrise;
            }

            public void setSunrise(String sunrise) {
                this.sunrise = sunrise;
            }

            public String getHigh() {
                return high;
            }

            public void setHigh(String high) {
                this.high = high;
            }

            public String getLow() {
                return low;
            }

            public void setLow(String low) {
                this.low = low;
            }

            public String getSunset() {
                return sunset;
            }

            public void setSunset(String sunset) {
                this.sunset = sunset;
            }

            public double getAqi() {
                return aqi;
            }

            public void setAqi(double aqi) {
                this.aqi = aqi;
            }

            public String getYmd() {
                return ymd;
            }

            public void setYmd(String ymd) {
                this.ymd = ymd;
            }

            public String getWeek() {
                return week;
            }

            public void setWeek(String week) {
                this.week = week;
            }

            public String getFx() {
                return fx;
            }

            public void setFx(String fx) {
                this.fx = fx;
            }

            public String getFl() {
                return fl;
            }

            public void setFl(String fl) {
                this.fl = fl;
            }

            public String getType() {
                return type;
            }

            public void setType(String type) {
                this.type = type;
            }

            public String getNotice() {
                return notice;
            }

            public void setNotice(String notice) {
                this.notice = notice;
            }
        }

        public static class ForecastBean {
            /**
             * date : 20
             * sunrise : 05:30
             * high : 高温 16.0℃
             * low : 低温 10.0℃
             * sunset : 18:52
             * aqi : 64.0
             * ymd : 2019-04-20
             * week : 星期六
             * fx : 东北风
             * fl : <3级
             * type : 小雨
             * notice : 雨虽小,注意保暖别感冒
             */

            private String date;
            private String sunrise;
            private String high;
            private String low;
            private String sunset;
            private double aqi;
            private String ymd;
            private String week;
            private String fx;
            private String fl;
            private String type;
            private String notice;

            public String getDate() {
                return date;
            }

            public void setDate(String date) {
                this.date = date;
            }

            public String getSunrise() {
                return sunrise;
            }

            public void setSunrise(String sunrise) {
                this.sunrise = sunrise;
            }

            public String getHigh() {
                return high;
            }

            public void setHigh(String high) {
                this.high = high;
            }

            public String getLow() {
                return low;
            }

            public void setLow(String low) {
                this.low = low;
            }

            public String getSunset() {
                return sunset;
            }

            public void setSunset(String sunset) {
                this.sunset = sunset;
            }

            public double getAqi() {
                return aqi;
            }

            public void setAqi(double aqi) {
                this.aqi = aqi;
            }

            public String getYmd() {
                return ymd;
            }

            public void setYmd(String ymd) {
                this.ymd = ymd;
            }

            public String getWeek() {
                return week;
            }

            public void setWeek(String week) {
                this.week = week;
            }

            public String getFx() {
                return fx;
            }

            public void setFx(String fx) {
                this.fx = fx;
            }

            public String getFl() {
                return fl;
            }

            public void setFl(String fl) {
                this.fl = fl;
            }

            public String getType() {
                return type;
            }

            public void setType(String type) {
                this.type = type;
            }

            public String getNotice() {
                return notice;
            }

            public void setNotice(String notice) {
                this.notice = notice;
            }
        }
    }
}

三、创建Api接口文件 WeatherApi.java

package com.jack.basemvp.api;

import com.jack.basemvp.bean.WeatherBean;

import java.util.Map;

import io.reactivex.Observable;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
import retrofit2.http.QueryMap;

public interface WeatherApi {
    String BASE_URL = "http://t.weather.sojson.com/";

    /**
     * 普通方式
     *
     * @param cityId
     * @return
     */
    //get 传一个参数
    @GET("api/weather/city/{cityId}")
    Call<WeatherBean> weatherInfo(@Path("cityId") int cityId);

    //get 传多个参数 用 & 拼接
    @GET("api/weather/city/101030100?")
    Call<WeatherBean> weatherInfo2(@QueryMap Map<String, String> params);

}

四、主UI界面中使用

RequestCommonActivity.java

package com.jack.basemvp.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.jack.basemvp.R;
import com.jack.basemvp.api.NewsRxApi;
import com.jack.basemvp.bean.WeatherBean;
import com.jack.basemvp.api.WeatherApi;
import com.jack.basemvp.util.http.RetrofitServiceManager;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.OkHttpClient;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

public class RequestCommonActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tv_result;
    private Button btn_req1, btn_req2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_request_common);

        initView();
    }

    private void initView() {
        tv_result = (TextView) findViewById(R.id.tv_result);
        btn_req1 = (Button) findViewById(R.id.btn_req1);
        btn_req2 = (Button) findViewById(R.id.btn_req2);
        btn_req1.setOnClickListener(this);
        btn_req2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_req1:
                requestWeather1();
                break;
            case R.id.btn_req2:
                requestWeather2();
                break;
        }
    }

    //get 请求 传一个参数到url中
    private void requestWeather1() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(WeatherApi.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        WeatherApi api = retrofit.create(WeatherApi.class);
        int cityId = 101030100; //城市ID
        api.weatherInfo(cityId).enqueue(new Callback<WeatherBean>() {
            @Override
            public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
                try {
                    //date":"20","sunrise":"05:30","high":"高温 16.0℃","low":"低温 10.0℃",
                    WeatherBean.DataBean.ForecastBean todayBean = response.body().getData().getForecast().get(0);
                    tv_result.setText(
                            "date1:" + todayBean.getDate() + "\n"
                                    + "high:" + todayBean.getHigh() + "\n"
                                    + "low:" + todayBean.getLow() + "\n"
                    );
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<WeatherBean> call, Throwable t) {
            }
        });
    }

    //get 请求 传一个参数到url中
    private void requestWeather2() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(WeatherApi.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        Map<String, String> params = new HashMap<>();
        params.put("rand", "1");
        params.put("key", "4ea58de8a7573377cec0046f5e2469d5");

        retrofit.create(WeatherApi.class).weatherInfo2(params).enqueue(new Callback<WeatherBean>() {
            @Override
            public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
                try {
                    //date":"20","sunrise":"05:30","high":"高温 16.0℃","low":"低温 10.0℃",
                    WeatherBean.DataBean.ForecastBean todayBean = response.body().getData().getForecast().get(0);
                    tv_result.setText(
                            "date2:" + todayBean.getDate() + "\n"
                                    + "high:" + todayBean.getHigh() + "\n"
                                    + "low:" + todayBean.getLow() + "\n"
                    );
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<WeatherBean> call, Throwable t) {
            }
        });
    }


}

界面布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="activity.RequestCommonActivity">

    <Button
        android:id="@+id/btn_req1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="普通请求-接口1"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/btn_req2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="普通请求-接口2"
        android:textAllCaps="false" />

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="结果展示" />

</LinearLayout>

本博客地址: wukong1688

本文原文地址:https://www.cnblogs.com/wukong1688/p/10745942.html

转载请著名出处!谢谢~~

猜你喜欢

转载自www.cnblogs.com/wukong1688/p/10745942.html