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


         一、背景

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

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

        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;

    }
     
     
    
    
   
   


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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

心灵行者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值