安卓仿手机网易新闻app项目开发系列之(三)数据抓取和解析 下

一.项目简介和思路

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


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值