Spinner实现获取天气预报

话不多说.先上才艺:
在这里插入图片描述

直辖市介绍

“10101”: “北京”,
“10102”: “上海”,
“10103”: “天津”,
“10104”: “重庆”,

天气预报,接口介绍

- 省 / 直辖市接口:


http://www.weather.com.cn/data/city3jdata/china.html
{
  "10101": "北京",
  "10102": "上海",
  "10103": "天津",
  "10104": "重庆",
  "10105": "黑龙江",
  "10106": "吉林",
  "10107": "辽宁",
  "10108": "内蒙古",
  "10109": "河北",
  "10110": "山西",
  "10111": "陕西",
  "10112": "山东",
  "10113": "新疆",
  "10114": "西藏",
  "10115": "青海",
  "10116": "甘肃",
  "10117": "宁夏",
  "10118": "河南",
  "10119": "江苏",
  "10120": "湖北",
  "10121": "浙江",
  "10122": "安徽",
  "10123": "福建",
  "10124": "江西",
  "10125": "湖南",
  "10126": "贵州",
  "10127": "四川",
  "10128": "广东",
  "10129": "云南",
  "10130": "广西",
  "10131": "海南",
  "10132": "香港",
  "10133": "澳门",
  "10134": "台湾"
}

- 市接口:

http://www.weather.com.cn/data/city3jdata/provshi/{编号}.html

例子:
http://www.weather.com.cn/data/city3jdata/provshi/10109.html
{
  "10": "邯郸",
  "11": "秦皇岛",
  "01": "石家庄",
  "02": "保定",
  "03": "张家口",
  "04": "承德",
  "05": "唐山",
  "06": "廊坊",
  "07": "沧州",
  "08": "衡水",
  "09": "邢台"
}

- 天气接口:

直辖市:
http://www.weather.com.cn/data/sk//直辖市+0100.html
非直辖市:
http://www.weather.com.cn/data/sk/++ 01.html

直辖市例子:
http://www.weather.com.cn/data/sk/101010100.html
{
  "weatherinfo": {
    "city": "北京",
    "cityid": "101010100",
    "temp": "27.9",
    "WD": "南风",
    "WS": "小于3级",
    "SD": "28%",
    "AP": "1002hPa",
    "njd": "暂无实况",
    "WSE": "<3",
    "time": "17:55",
    "sm": "2.1",
    "isRadar": "1",
    "Radar": "JC_RADAR_AZ9010_JB"
  }
}

非直辖市例子:
http://www.weather.com.cn/data/sk/101100101.html
{
  "weatherinfo": {
    "city": "太原",
    "cityid": "101100101",
    "temp": "25.9",
    "WD": "东北风",
    "WS": "小于3级",
    "SD": "22%",
    "AP": "919.9hPa",
    "njd": "暂无实况",
    "WSE": "<3",
    "time": "17:55",
    "sm": "1.3",
    "isRadar": "1",
    "Radar": "JC_RADAR_AZ9351_JB"
  }
}

OkHttp,Retrofit+RxJava,JSONObject介绍

导入依赖:

//Retrofit:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

//glide4:     //用于图片处理
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'

//RxJava:
implementation "io.reactivex.rxjava2:rxjava:2.1.3" // 必要rxjava2依赖
implementation "io.reactivex.rxjava2:rxandroid:2.0.1" // 必要rxandrroid依赖,切线程时需要用到
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' // 必要依赖,和Retrofit结合必须用到,下面会提到

因为Retrofit的底层是OkHttp,所以添加了Retrofit的依赖不需要再次添加OkHttp的依赖

OkHttp使用:

直接上代码:

OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
        .url("请求的接口")
        .build();

okHttpClient.newCall(request).enqueue(new okhttp3.Callback() {
    @Override
    public void onFailure(okhttp3.Call call, IOException e) {
    }
    @Override
    public void onResponse(okhttp3.Call call, okhttp3.Response response) throws 
        String json = response.body().string(); //获取Json字符串
        Log.i("onResponse", json + "");

    }
});

Retrofit+RxJava

  • 第一步先定义Retrofit接口:
import io.reactivex.Observable;//注意导包
public interface RetrofitService {

    public String Uri = "http://www.weather.com.cn/";

    //市  API
    @GET("data/city3jdata/china.html")
    Call<ProvinceBean> getProvinceUri();

    //天气 API
    @GET("data/sk/{id}.html")
    Observable<WeatherBean> getWeatherUri(@Path("id") String id);
}
  • 在代码中使用Retrofit,Retrofit已经非常流行了,这里就不浪费时间解释了

RetrofitService retrofitService = new Retrofit.Builder()
        .baseUrl(RetrofitService.Uri)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build()
        .create(RetrofitService.class);
        Observable<WeatherBean> observable = retrofitService.getWeatherUri(province_code + city_code +zhixiashiCode);
observable.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<WeatherBean>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(WeatherBean weatherBean) {
                   }

            @Override
            public void onError(Throwable e) {
                Log.i("szjonError",e.getMessage());
            }

            @Override
            public void onComplete() {

            }
        });

JSONObject解析数据

  • 第一步:先试用OKHttp获取Json字符串:
  • 第二步:使用原生JSONObject获取key
  • 第三步:通过key循环获取value
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
        .url("http://www.weather.com.cn/data/city3jdata/provshi/" + province_code + ".html")
        .build();

okHttpClient.newCall(request).enqueue(new okhttp3.Callback() {
    @Override
    public void onFailure(okhttp3.Call call, IOException e) {
    }
    @Override
    public void onResponse(okhttp3.Call call, okhttp3.Response response) throws IOException {
        String json = response.body().string(); //获取Json字符串
        Log.i("onResponse", json + "");

        try {   //使用最原生JSONObject获取数据
            JSONObject jsonObject = new JSONObject(json);
            Iterator<String> keys = jsonObject.keys();//获取json字符串的key
            mList_city.clear();//保证数据不重复需要先将list集合清空
            while (keys.hasNext()) {//循环每一个值
                String next = keys.next();//获取key
                String value = (String) jsonObject.get(next);//获取value
                Log.i("szjnext", next + "\t\t" + value);
                mList_city.add(value);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
       ;


    }
});

Git链接: lanyangyang.

猜你喜欢

转载自blog.csdn.net/weixin_44819566/article/details/106520668
今日推荐