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

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

本文的目標是用 Retrofit寫一個網絡請求:

本文以從獲取天氣預報接口 (具體接口查看上文 免費天氣預報接口)爲例,講解 Retrofit2 的使用java

廢話很少說,開擼react

 

1、添加依賴android

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

//retrofit2
compile 'com.squareup.retrofit2:retrofit:2.3.0'//導入retrofit
compile 'com.squareup.retrofit2:converter-gson:2.3.0'//轉換器,請求結果轉換成Model

 

2、建立Beanapi

根據接口返回的JSon數據,使用GsonFormat插件自動建立 WeatherBean 文件 (GsonFormat插件 的安裝方法和其他插件安裝方法並沒有二致)網絡

1)打開連接http://t.weather.sojson.com/api/weather/city/101030100,而後複製返回的json數據app

2)新建WeatherBean.java ,而後 Alt + Delete ,選擇GsonFormat,將複製到的JSON數據賦值進去,點擊 「肯定」 生成 便可ide

這是我自動生成的文件:佈局

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; } } } }

 

3、建立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);  }

 

4、主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

轉載請著名出處!謝謝~~

相關文章
相關標籤/搜索