一.项目简介和思路
上次已经完成了数据的抓取,现在来对数据进行解析,也就是把截取到的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:这里仍然是使用磨砺视频里的演示效果,都差不多。。。。。)