谷歌在Android6.0之后就废弃了使用HttpClinet进行网络连接。所以,这里需要重点学习的是通过HttpUrlConnect进行网络连接。
String path="这里是你想要的连接"; URL url=new URL(path); HttpURLConnection huc=(HttpURLConnection)url.openConnection(); huc.setConnectTimeout(3000); huc.setReadTimeout(3000);
//请求方式,Get或者Post; huc.setRequestMethod("Get"); //IO流操作 if(huc.getResponseCode()==200){ InputStream is=huc.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); StringBuffer sb=new StringBuffer(); String line; while((line=br.readLine())!=null){ sb.append(line); } sb.toString(); }
通常情况下,需要判断网络是否连接:
public Boolean isNet(Context context){ //通过上下文拿到系统的连接服务,返回一个ConnectivityManager对象 ConnectivityManager cm=(ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
//通过这个对象再拿到连接管理器。 NetworkInfo nwi= cm.getActiveNetworkInfo();
//判断是否有网 if(nwi!=null){ return nwi.isAvailable(); }else{ return false; } }
之后就是如果从网络解析数据:
Json解析:
谷歌官方的Gson解析数据:
首先写一个DataBean,用来获取Gson解析的数据,这里要特别注意解析的顺序,和对象名一定要和Json一样的格式:
{
"result": {
"realtime": {
"wind": {
"windspeed": "0.0",
"direct": "西南风",
"power": "1级",
"offset": null
},
"time": "20:00:00",
"weather": {
"humidity": "35",
"img": "1",
"info": "多云",
"temperature": "30"
},
"dataUptime": "1467463816",
"date": "2016-07-02",
"city_code": "101270101",
"city_name": "成都",
"week": "6",
"moon": "五月廿八"
},
"life": {
"date": "2016-7-2",
"info": {
"kongtiao": [
"部分时间开启",
"天气热,到中午的时候您将会感到有点热,因此建议在午后较热时开启制冷空调。"
],
"yundong": [
"较适宜",
"天气较好,户外运动请注意防晒,推荐您在室内进行低强度运动。"
],
"ziwaixian": [
"中等",
"属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。"
],
"ganmao": [
"少发",
"各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。"
],
"xiche": [
"不宜",
"不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。"
],
"wuran": [
"较差",
"气象条件较不利于空气污染物稀释、扩散和清除,请适当减少室外活动时间。"
],
"chuanyi": [
"炎热",
"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。"
]
}
},
"weather": [
{
"date": "2016-07-02",
"week": "六",
"nongli": "五月廿八",
"info": {
"dawn": null,
"day": [
"1",
"多云",
"33",
"南风",
"微风",
"06:05"
],
"night": [
"7",
"小雨",
"22",
"南风",
"微风",
"20:10"
]
}
},
{
"date": "2016-07-03",
"week": "日",
"nongli": "五月廿九",
"info": {
"dawn": [
"7",
"小雨",
"22",
"南风",
"微风",
"20:10"
],
"day": [
"1",
"多云",
"31",
"南风",
"微风",
"06:05"
],
"night": [
"1",
"多云",
"22",
"无持续风向",
"微风",
"20:10"
]
}
},
{
"date": "2016-07-04",
"week": "一",
"nongli": "六月初一",
"info": {
"dawn": [
"1",
"多云",
"22",
"无持续风向",
"微风",
"20:10"
],
"day": [
"2",
"阴",
"31",
"无持续风向",
"微风",
"06:05"
],
"night": [
"3",
"阵雨",
"23",
"北风",
"微风",
"20:10"
]
}
},
{
"date": "2016-07-05",
"week": "二",
"nongli": "六月初二",
"info": {
"dawn": [
"3",
"阵雨",
"23",
"北风",
"微风",
"20:10"
],
"day": [
"1",
"多云",
"28",
"南风",
"微风",
"06:06"
],
"night": [
"7",
"小雨",
"23",
"北风",
"微风",
"20:10"
]
}
},
{
"date": "2016-07-06",
"week": "三",
"nongli": "六月初三",
"info": {
"dawn": [
"7",
"小雨",
"23",
"北风",
"微风",
"20:10"
],
"day": [
"8",
"中雨",
"29",
"北风",
"微风",
"06:06"
],
"night": [
"8",
"中雨",
"21",
"北风",
"微风",
"20:10"
]
}
},
{
"date": "2016-07-07",
"week": "四",
"nongli": "六月初四",
"info": {
"dawn": null,
"day": [
"3",
"阵雨",
"27",
"东北风",
"微风",
"07:30"
],
"night": [
"3",
"阵雨",
"22",
"东北风",
"微风",
"19:30"
]
}
},
{
"date": "2016-07-08",
"week": "五",
"nongli": "六月初五",
"info": {
"dawn": null,
"day": [
"3",
"阵雨",
"27",
"东北风",
"微风",
"07:30"
],
"night": [
"3",
"阵雨",
"22",
"东北风",
"微风",
"19:30"
]
}
}
],
"pm25": {
"key": "",
"show_desc": "0",
"pm25": {
"curPm": "54",
"pm25": "34",
"pm10": "54",
"level": "2",
"quality": "良",
"des": "今天的空气质量是可以接受的,除少数异常敏感体质的人群外,大家可在户外正常活动。"
},
"dateTime": "2016年07月02日20时",
"cityName": "成都"
},
"isForeign": 0
},
"error_code": 0,
"reason": "Succes"
}
DataBean:
package com.zhuoxin.bean; import java.io.Serializable; import java.util.List; public class WeatherDataBean implements Serializable{ /** * */ private static final long serialVersionUID = 1L; public String reason;//返回请求成功,或者是失败的原因 public Reslut result; public static class Reslut implements Serializable{ public Realtime realtime; public static class Realtime implements Serializable{ public String date;//当天的日期 public String time;//更新的时间 public String city_name;//当前的城市名称 public String week;//星期几 public String moon;//农历日期 public Wind wind; public static class Wind implements Serializable{ public String direct;//风向 public String power;//风力 } public Weather weather; public static class Weather implements Serializable{ public String info; //天气情况 public String temperature;//当前的温度 } } public Life life;//生活指数 public static class Life implements Serializable{ public Info info;//生活指数的info public static class Info implements Serializable{ List<String> kongtiao; List<String> yundong; List<String> ziwaixian; List<String> ganmao; List<String> xiche; List<String> wuran; List<String> chuanyi; } } List<FutureWeather> weather;//未来几天的天气数组的key public static class FutureWeather implements Serializable{ public String date;//未来几天天气的日期 public String week;//未来几天天气的星期几 public String nongli;//未来几天天气的农历日期 public Info info;//未来几天天气的info public static class Info implements Serializable{ List<String> day; //白天的天气信息 List<String> night;//晚上的天气信息 } } public Pm25 pm25; public static class Pm25 implements Serializable{ public Pm250 pm25; public static class Pm250 implements Serializable{ public String curPm;//当前pm2.5的值 public String quality;//空气情况 public String des; // 提示 } } } }
之后的事就非常简单了:
public <WeatherDataBean> parsejson(String json){ Gson gs=new Gson();
传两个参数:一个是Json连接,一个是DataBean的类。 return gs.fromJson(json, WeatherDataBean.class); }
XML解析这里讲谷歌的PULL解析XML,XML解析同样的要写一个DataBean用来存放解析出来要解析的数据:
XML:
<feed xmlns="http://www.w3.org/2005/Atom">
<title type="text">博客园_48小时阅读排行</title>
<id>uuid:f59e7376-bd59-4244-91c8-c1d8a91207db;id=42519</id>
<updated>2016-07-02T13:14:13Z</updated>
<entry>
<id>5631573</id>
<title type="text">通过几个Hello World感受.NET Core全新的开发体验</title>
<summary type="text">
2016年6月27日,这是一个特殊的日子,微软全新的.NET开发平台.NET Core的RTM版本正式发布。我个人将.NET Core的核心特性归结为三点,它们的首字母组成一个非常好记的简称——COM,分别代表的含义Cross-Platform、Open-Source和Modularization。...
</summary>
<published>2016-06-30T23:19:00+08:00</published>
<updated>2016-07-02T13:14:13Z</updated>
<author>
<name>Artech</name>
<uri>http://www.cnblogs.com/artech/</uri>
<avatar>http://pic.cnblogs.com/face/u19327.jpg</avatar>
</author>
<link rel="alternate" href="http://www.cnblogs.com/artech/p/net-core-hello-world.html"/>
<diggs>59</diggs>
<views>5023</views>
<comments>58</comments>
</entry>
</feed>
Bean文件,同个生成get和set存取数据:
package com.yakir.databean;
import android.graphics.Bitmap;
/**
* Created by qbqw7 on 2016/6/26.
*/
public class MainBolgData {
private String id;
private String title;
private String summary;
private String published;
private String updated;
private String name;
private String uri;
private Bitmap avatar;
private String link;
private String diggs;
private String views;
private String comments;
private Bitmap topicIcon;
private String sourceName;
private String posts;
private String comment;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getPublished() {
return published;
}
public void setPublished(String published) {
this.published = published;
}
public String getUpdated() {
return updated;
}
public void setUpdated(String updated) {
this.updated = updated;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public Bitmap getAvatar() {
return avatar;
}
public void setAvatar(Bitmap avatar) {
this.avatar = avatar;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getDiggs() {
return diggs;
}
public void setDiggs(String diggs) {
this.diggs = diggs;
}
public String getViews() {
return views;
}
public void setViews(String views) {
this.views = views;
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public Bitmap getTopicIcon() {
return topicIcon;
}
public void setTopicIcon(Bitmap topicIcon) {
this.topicIcon = topicIcon;
}
public String getSourceName() {
return sourceName;
}
public void setSourceName(String sourceName) {
this.sourceName = sourceName;
}
public String getPosts() {
return posts;
}
public void setPosts(String posts) {
this.posts = posts;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}
PULL解析:
public List<Data> parseXml(InputStream is) { try {
// 建一个解析工厂 XmlPullParserFactory xpf=XmlPullParserFactory.newInstance();
//拿到解析器 XmlPullParser parser=xpf.newPullParser();
//给解析器装填原料 parser.setInput(is, "UTF-8"); //拿到解析的时间类型 int evenType=parser.getEventType();
//开始解析,做循环判断,如果不是xml文档末就一直解析 while (evenType!=XmlPullParser.END_DOCUMENT) { String tagaName=parser.getName(); switch (evenType) {
//开始解析xml的时候创建一个list容器存储对象,将data初始化。 case XmlPullParser.START_DOCUMENT: list=new ArrayList<Data>(); data=new Data(); break;
//解析标签,从标签头开始 case XmlPullParser.START_TAG:
//如果标签匹配了"entry"这个字符串就解析 if (tagaName.equals("entry")) { //如果标签匹配了"title"这个字符串就将这个标签后面的字符串取出来 }else if (tagaName.equals("title")) { data.setTitle(parser.nextText()); }else if (tagaName.equals("summary")) { data.setSummary(parser.nextText()); }else if (tagaName.equals("name")) { data.setName(parser.nextText()); }else if (tagaName.equals("updated")) { data.setUpdated(parser.nextText()); } if (tagaName.equals("comments")) {
//当判断到是末尾字符串标签的时候就把这个对象撞到list中 data.setComments(parser.nextText()); list.add(data); } break; case XmlPullParser.END_TAG: break; }
//如果数据多条,当取完了就应该跳到下一个事件类型。
eventType = parser.next();
最后来一波吉祥物:
//┏┓ ┏┓ //┏┛┻━━━┛┻┓ //┃ ┃ //┃ ━ ┃ //┃ ┳┛ ┗┳ ┃ //┃ ┃ //┃ ┻ ┃ //┃ ┃ //┗━┓ ┏━┛ // ┃ ┃ 神兽保佑 // ┃ ┃ 代码无BUG! // ┃ ┗━━━┓ // ┃ ┣┓ // ┃ ┏┛ // ┗┓┓┏━┳┓┏┛ // ┃┫┫ ┃┫┫ // ┗┻┛ ┗┻┛