昨天给大家介绍了Spinner,今天给大家带来简单的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();
}
;
}
});