安卓仿手机网易新闻app项目开发系列之(三)数据抓取和解析 下
来源:互联网 发布:科目三路考软件 编辑:程序博客网 时间:2024/06/06 00:58
一.项目简介和思路
上次已经完成了数据的抓取,现在来对数据进行解析,也就是把截取到的json格式数据解析成有效的数据。
二.项目流程
1.解析json数据
1)封装数据包
这里需要给解析方法传入“title”,“url”“thumbnail”数据,为了方便我们把数据封装成一个bean包,代码如下:public class Data { private String title; private String url; private String thumbnail; public Data() { } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getThumbnail() { return thumbnail; } public void setThumbnail(String thumbnail) { this.thumbnail = thumbnail; }}
分别重写get、set还有构造方法,进行初始化。
2)解析数据方法
public void initMessageList(String json) { try { JSONArray array = new JSONArray(json); msg_list = new ArrayList[array.length()]; for (int i = 0; i < array.length(); i++) { JSONArray arr = array.getJSONArray(i); msg_list[i] = new ArrayList<>(); for (int j = 0; j < arr.length(); j++) { JSONObject obj = arr.getJSONObject(j); Data data = new Data(); data.setTitle(obj.getString("title")); data.setUrl(obj.getString("url")); data.setThumbnail(obj.getString("thumbnail")); msg_list[i].add(data); } } } catch (JSONException e) { e.printStackTrace(); } mlistener.upData(msg_list); }
此方法就是通过层层解剖,从[ [ { } ] ] 里抽取出最里层的元素{ },然后把里面的title、url 、thumbnail数据加载到data这个对象中,然后把data数据加载到msg_list[i ] 这个集合数组中。
2.接口回调,更新界面
在这里先讲个概念“”接口回调“”。应该也有人了解过,定义是:把实现某一个接口类创建的对象的引用赋给接口变量,那么该接口变量就可以调用被该类实现的接口方法。估计很多人听到这就开始晕了,没事,后面结合代码来详解。
再来说说为什么需要接口回调。因为现在要做的就是A类想获得数据更新,以前一般就是在A类中写更新方法,但是如果是有多个类同时都想更新相同的数据呢,那这样每个类都得写一个更新方法,此时代码的任务就比较大和繁琐。而且更新数据是个耗时的过程,你不知道什么时候能更新好,如果说时间很长那等它执行完后就浪费了很多时间,导致效率很低。因此采用接口回调机制,只要写一个通用的接口函数,哪个类需要更新数据只要实现该接口然后写相应的接口方法就行了。 这样就之前常听到的低耦合性,使的每个模块高度独立。更新的过程就可以不用关心,只要你注册了更新后就可以做其他事情,等到更新结束接口回调会通知你,这样效率也提高了。接下来结合代码详细解释。
在这里先假设一个场景,小王给小李打电话,问他“帮我打排位上白银”。小李接了电话就和他说了回复他“好,过几天给你消息”,过了几天后,小李回电话,说“拿去,上黄金了”。小王打开手机更新完游戏后,就看到了黄金框。就类比为小王就是请求数据更新类,也可以说监听数据加载类,而小李就是实现数据加载类。
1)加载数据类 (小李)
//监听数据加载类的父类接口(即firstpagefragment是监听数据者) public interface CallBackListener { void upData(List<Data>[] msg_list); }
既然是实现接口回调,首先得定义一个接口,接口里面定义一个方法,说明需要传递什么结果,把传递结果当作方法的参数,这里的结果参数就是 List<Data>[] msg_list。,这个结果就是小李回电话的内容。 接口方法也可以比作是他们打电话的电话号码,双方必须得按照这个号码才可以进行通信。public class JsonUtils{ private CallBackListener mlistener ; //声明一个接口类型变量 //监听数据类通过此方法注册 public JsonUtils(CallBackListener listener) { this.mlistener = listener;//实现类 }
这部分是声明一个接口类型变量,用于接收实现类对象的引用.jsonUtil( )方法就是用来让监听数据类来注册(这里就好比小王给小李打电话的动作,因为你要让他给你排位,得先通知他吧)
public void initMessageList(String json) { try { JSONArray array = new JSONArray(json); msg_list = new ArrayList[array.length()]; for (int i = 0; i < array.length(); i++) { JSONArray arr = array.getJSONArray(i); msg_list[i] = new ArrayList<>(); for (int j = 0; j < arr.length(); j++) { JSONObject obj = arr.getJSONObject(j); Data data = new Data(); data.setTitle(obj.getString("title")); data.setUrl(obj.getString("url")); data.setThumbnail(obj.getString("thumbnail")); msg_list[i].add(data); } } } catch (JSONException e) { e.printStackTrace(); } //通知注册进来的类更新数据 mlistener.upData(msg_list); }
这里主要是写了红色标注的那句代码,前面的都是之前加载好的数据,就是把json格式数据转换成集合数组。然后把这个集合数组 msg_list传入updata()更新数据的方法里,通过mlistener回调到实现类里的updata()方法。从而实现接口回调过程。(注意,这里有的人会问为什么mlistener可以回调实现类的updata()方法,因为前面说的接口回调的定义:把实现某一个接口类创建的对象的引用赋给接口变量,那么该接口变量就可以调用被该类实现的接口方法。mlistener里面存放实现类传递过来的对象引用,不明白的再往后看) 这一步就相当于小李已经帮小王上了黄金,得通知他让他更新游戏来看看段位。这里的upata()方法我理解为小王的电话号码,通过回拨(回调)电话来通知小王。
2)数据更新类 (小王)
public class FirstpageFragment extends Fragment implements JsonUtils.CallBackListener{ private void getData() {
jsonUtils =new JsonUtils(FirstpageFragment.this);//this表示 firstfragment的对象;注册本类去监听数据加载变化 //加载数据 jsonUtils.getResult(); } // 回调的更新方法 public void upData(List<Data> [] msg_list) { this.msg_list = msg_list; List<Data> data=msg_list[0]; for (int i=0;i<4;i++){ banner_url.add(data.get(i).getThumbnail()); } adapter.notifyDataSetChanged(); // initData(); }
这里firstpagefragment实现了接口类,然后重新写接口方法。首先是通过jsonutil()构造方法把本类监听加载数据变化注册进去,也就是上面说的小王有事找小李得先打个电话通知下。这里还有一点就是传递了当前类的对象引用,用于后面回调。 然后就执行getresult();也就是执行mlistener.upData(msg_list); (因为这个方法包含在getresult里面)进行加载数据和回调通知数据更新。
下面的uptata()就是回调的更新方法,在这里进行具体的数据更新。这里的msg_list()就相当于小李上黄金后的结果数据,然后打电话告诉小王,让他更新游戏。我们这里获取三条图片数据用来显示。到这里,大体的功能代码已经写完,最后演示下我们的劳动成果(ps:这里仍然是使用磨砺视频里的演示效果,都差不多。。。。。)
- 安卓仿手机网易新闻app项目开发系列之(三)数据抓取和解析 下
- 安卓仿手机网易新闻app项目开发系列之(三)数据抓取和解析 上
- 安卓仿手机网易新闻app项目开发系列之(四)数据分离与填充界面 下
- 安卓仿手机网易新闻app项目开发系列之(一)项目简介和 界面搭建
- 安卓仿手机网易新闻app项目开发系列之(五)tablayout事件和recycle事件
- 安卓仿手机网易新闻app项目开发系列之(四)数据分离与填充界面 上
- 安卓仿手机网易新闻app项目开发系列之(二)轮播图显示和RecyclerView适配器编写
- 安卓仿手机网易新闻app项目开发系列之(六)点击页面跳转和网络路径拼接
- Android demo-->网易新闻风格的RSS新闻抓取项目(一) 菜单栏、滚动广告和新闻列表的配置
- 练习项目 一款新闻app的开发 (三):通过Rxjava + Retrofit2框架获取网络数据
- Android demo-->网易新闻风格的RSS新闻抓取项目(二) 新闻列表刷新、天气预报、设置页面滑动开关
- 抓取网易新闻
- iOS项目之Swift新闻App(二)—网络数据请求和添加TableHeader
- 仿网易新闻APP(三)——标题栏之24小时要闻
- ios开发系列之XML解析和JSON解析数据
- 网页数据抓取之新浪新闻数据
- iOS项目之Swift新闻App(三)—访问新闻详情
- 抓取搜狗微信百度新闻网易新闻
- android mk
- 【0031】SQL查询--简单查询--投影运算
- jsp九大内置对象
- GCC内联函数
- Vue入门学习(二)
- 安卓仿手机网易新闻app项目开发系列之(三)数据抓取和解析 下
- C++使用fixed和precision控制小数和有效位数的输出
- JSP小脚本
- 使用JavaScript生成二维码
- 解决微信OAuth2.0网页授权只能设置一个回调域名的问题
- jass——group的使用
- JSP表达式
- jsp页面的两种跳转方式(request和response的区别)
- PAT 乙等 1032 挖掘机技术哪家强