股票应用开发——网络数据的获取(一)


         一、背景

        之前很少写技术博客一方面是怕自己的技术不到家,把大家带到坑里;另一方面就是自己太懒了。现在鼓起勇气把自己的心得体会以及项目的实现思路展现给大家。希望和大家一起学习一起进步!害羞

        下面说一下此次实现的主要功能:

        1. 展示指标的图表:MA,VOL,MACD,KDJ;

        2. 实现股票的十字线功能,以及当天股票详情信息框的展示;

        3. 手势:

        1>    单击实现展示十字线和当天股票详情信息框,再次点击消失;

        2>    在不出现十字线的情况下,单指滑动屏幕实现图表的滚动;

        3>    实现双指的缩放;

        4>    实现上下图表的联动,上下图表同时滚动;

       废话不多说,按照惯例首先展示程序运行结果:
   

上面组图展示的分别是:

第一幅:为K线图和成交量图(VOL);第二幅:K线图和MACD图;第三幅:K线图和KDJ图表;

如果感觉还可以的话记得给我点个赞,很辛苦的好吧!谢谢大家!

-------------------------------------------------------------------------------------------------------------------

        好了言归正传,本篇博客主要是数据的获取以及解析:

首先获取网络数据:

接口服务器提供的是XML的数据格式,需要使用XML的相关解析方式;在这里使用的是PULL解析。

思路:

使用的是HttpURLConnection使用GET的方式建立网络的连接获取信息流InputStream,下一步就是利用平PULL解析,解析网络获取的数据,并将解析的数据封装到之前定义的股票对象中。

下面是代码片段:

/**
     * 从网络获取数据
     *
     * @return InputStream
     */
    private InputStream getData() {
        InputStream is = null;
        HttpURLConnection conn = null;//创建网络链接对象
        try {
            URL u = new URL("API数据接口");//创建url对象
            conn = (HttpURLConnection) u.openConnection();//创建网络链接对象
            conn.setRequestMethod("GET");//设置网络请求方式;
            conn.setDoInput(true);//允许输入流,下载;
            conn.setUseCaches(false);
            conn.setConnectTimeout(5000);//设置网络连接时间
            int code = conn.getResponseCode();//获取网络请求的响应码;
            Log.i("tag", "ParserUtil..code:" + code);
            if (code == 200) {//说明网络请求成功
                is = conn.getInputStream();//获取文件的输入流

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return is;//返回流
    }
    /**
     * PULL解析从网络获取的数据
     *
     * @return List
   
   
    
    
     */
    public List
    
    
     
      parserData() {
        //创建XmlPullParser 实例
        XmlPullParser xpp = Xml.newPullParser();
        InputStream mInputStream = getData();
        try {
            //设置输入流并标明编码方式
            if (mInputStream != null){
                xpp.setInput(mInputStream, "UTF-8");
                //产生第一个事件
                int eventType = xpp.getEventType();

                while (eventType != XmlPullParser.END_DOCUMENT) {
                    switch (eventType) {

                        case XmlPullParser.START_DOCUMENT: //判断当前事件是否为开始事件
                            mList = new ArrayList
     
     
      
      ();//初始化集合
                            break;

                        case XmlPullParser.START_TAG://判断但前事件是否为标签元素的开始事件
                            if (xpp.getName().equals("data")) {// 判断开始标签元素是否是data
                                stockInfo = new StockInfo();//初始化对象
                            } else if (xpp.getName().equals("date")) {//date
                                eventType = xpp.next();//让解析器指向date属性的值
                                stockInfo.setDate(xpp.getText());//date赋值
                            } else if (xpp.getName().equals("open")) {//open
                                eventType = xpp.next();//让解析器指向open属性的值
                                stockInfo.setOpen(Float.valueOf(xpp.getText()));//open赋值

                            } else if (xpp.getName().equals("close")) {//close
                                eventType = xpp.next();//让解析器指向close属性的值
                                stockInfo.setClose(Float.valueOf(xpp.getText()));//close赋值

                            } else if (xpp.getName().equals("high")) {//high
                                eventType = xpp.next();//让解析器指向high属性的值
                                stockInfo.setHigh(Float.valueOf(xpp.getText()));//high赋值

                            } else if (xpp.getName().equals("low")) {//low
                                eventType = xpp.next();//让解析器指向low属性的值
                                stockInfo.setLow(Float.valueOf(xpp.getText()));//low赋值

                            } else if (xpp.getName().equals("volume")) {//volume
                                eventType = xpp.next();//让解析器指向volume属性的值
                                stockInfo.setVolume(xpp.getText());//volume赋值

                            } else if (xpp.getName().equals("turnover")) {//turnover
                                eventType = xpp.next();//让解析器指向turnover属性的值
                                stockInfo.setTurnover(xpp.getText());//turnover赋值

                            }
                            break;
                        case XmlPullParser.END_TAG://判断当前事件是否为标签元素结束事件
                            if (xpp.getName().equals("data")) {// 判断开始标签元素是否是data
                                mList.add(stockInfo);//对象添加进集合
                                stockInfo = null;
                            }
                            break;

                    }
                    // 进入下一个元素并触发相应事件
                    eventType = xpp.next();

                }
                return mList;
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
//            Log.i("tag", "ParserUtil..mlist:" + mList.size() + getTime());
        }
        return null;

    }
     
     
    
    
   
   


下一篇博客将会讲述:相关指标的含义以及计算,敬请期待!




你在学习Python数据分析的时候,是否遇到过在这些问题? 别慌!这些都是数据科学入门常见问题。从入门到上手再到解决实际问题,数据科学看似复杂,但如果你掌握了正确的学习方法,完全可以极速入门。 【职场人进阶必备  数据分析/挖掘一点通】 如今的职场上,90%以上的岗位都会涉及数据问题。 以产品文案岗位为例,在一个新产品推向市场之前,文案需要考虑: 此时,可以关注一下市场上已有的相关产品推广数据,如:哪些文案打开率更高?哪些文案转化更好?目标用户的购买习惯如何? 以此作为下一步工作开展的依据,对产品文案工作者来说,可以少走很多弯路。 学会数据分析/挖掘,等于站巨人的肩膀上工作,轻松且高效。 【爬虫、数据分析、数据挖掘知识点三合一】数据问题一网打尽 本课程将知识点悉数融入实战项目,不空谈语法,帮助学员在实践中获取知识,目标是:让学员能自主完成数据采集、数据分析与数据挖掘。 学习完本课程,你可以熟练掌握: 【实战案例超实用,轻松拥有“睡后收入”!】 本课程以股票案例为主线,串联爬虫、数据分析以及数据挖掘多个知识点。 通过实战案例演练,你可以全面掌握股票收益的分析和预判方法,在收获新技能的同时,也有机会获得“睡后收入”! 四大优势: 三重权益:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心灵行者

你的鼓励是我最大的创作动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值