谷歌在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! // ┃ ┗━━━┓ // ┃ ┣┓ // ┃ ┏┛ // ┗┓┓┏━┳┓┏┛ // ┃┫┫ ┃┫┫ // ┗┻┛ ┗┻┛