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

原创 2016年08月29日 16:07:42


        一、背景

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

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

        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;

    }


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




版权声明:本文为博主原创文章,未经博主允许不得转载。

股票应用开发——相关指标的含义(二)

上一篇博客主要是网络数据的获取以及解析,本篇博客将要讲述的是股票开发过程中相关指标的计算以及含义!在这里声明一点就是,不在贴出指标的计算代码,出于相关考虑敬请谅解!如有需要可以留言咱们一起探讨! 一...
  • zxm528
  • zxm528
  • 2016年08月29日 17:16
  • 326

股票应用开发——图表的绘制(三)

大家好,又一次和大家见面了!最近在写关于股票应用开发过程中的新的体会,希望对大家有所帮助,让大家不要向我一样,少走一些弯路。还用就是最近在更新这个系列的博客,怕到后面忙起来或者不想写了就落下了!   ...
  • zxm528
  • zxm528
  • 2016年08月30日 14:14
  • 302

Android应用开发之获取网络数据

J2SE实现网络图片的获取 [html] view plaincopy public static void main(String[] args) t...

Android应用开发:网络工具——Volley(二)

[-] 引言源头RequestQueueCacheDispatcher缓存操作NetworkDispatcher网络处理ExecutorDelivery消息分发者与Request请求总结 ...

android网络异步应用开发模式之——Android 异步加载解决方案

Android的Lazy Load主要体现在网络数据(图片)异步加载、数据库查询、复杂业务逻辑处理以及费时任务操作导致的异步处理等方面。在介绍Android开发过程中,异步处理这个常见的技术问题之前,...

Android应用开发:网络工具——Volley(一)

以Cloudant为例详细介绍Android网络请求工具Volley中StringRequest和JsonObjectRequest的使用方法。...
  • airk000
  • airk000
  • 2014年09月01日 21:14
  • 14045
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:股票应用开发——网络数据的获取(一)
举报原因:
原因补充:

(最多只允许输入30个字)