andoid下的股票行情开发

1.信息类

  1 public class SinaStockInfo {
  2
  3     /**
  4      * Sina股票数据接口 以大秦铁路(股票代码:601006)为例,如果要获取它的最新行情,只需访问新浪的股票数据
  5      * 接口:http://hq.sinajs.cn/list=sh601006这个url会返回一串文本,例如:
  6      *
  7      * var hq_str_sh601006="大秦铁路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91,
  8      * 26.92, 22114263, 589824680, 4695, 26.91, 57590, 26.90, 14700, 26.89,
  9      * 14300, 26.88, 15100, 26.87, 3100, 26.92, 8900, 26.93, 14230, 26.94,
 10      * 25150, 26.95, 15220, 26.96, 2008-01-11, 15:05:32";
 11      *
 12      * 这个字符串由许多数据拼接在一起,不同含义的数据用逗号隔开了,按照程序员的思路,顺序号从0开始。 0:”大秦铁路”,股票名字;
 13      * 1:”27.55″,今日开盘价; 2:”27.25″,昨日收盘价; 3:”26.91″,当前价格; 4:”27.55″,今日最高价;
 14      * 5:”26.20″,今日最低价; 6:”26.91″,竞买价,即“买一”报价; 7:”26.92″,竞卖价,即“卖一”报价;
 15      * 8:”22114263″,成交的股票数,由于股票交易以一百股为基本单位,所以在使用时,通常把该值除以一百;
 16      * 9:”589824680″,成交金额,单位为“元”,为了一目了然,通常以“万元”为成交金额的单位,所以通常把该值除以一万;
 17      * 10:”4695″,“买一”申请4695股,即47手; 11:”26.91″,“买一”报价; 12:”57590″,“买二”
 18      * 13:”26.90″,“买二” 14:”14700″,“买三” 15:”26.89″,“买三” 16:”14300″,“买四”
 19      * 17:”26.88″,“买四” 18:”15100″,“买五” 19:”26.87″,“买五”
 20      * 20:”3100″,“卖一”申报3100股,即31手; 21:”26.92″,“卖一”报价 (22, 23), (24, 25),
 21      * (26,27), (28, 29)分别为“卖二”至“卖四的情况” 30:”2008-01-11″,日期; 31:”15:05:32″,时间;
 22      */
 23
 24     // 股票名字
 25     public String mName;
 26     // 今日开盘价
 27     public float mTodayPrice;
 28     // 昨日收盘价
 29     public float mYestodayPrice;
 30     // 当前价
 31     public float mNowPrice;
 32     // 今日最高价
 33     public float mHighestPrice;
 34     // 今日最低价
 35     public float mLowestPrice;
 36     // 买一价
 37     public float mBuy1Price;
 38     // 卖一价
 39     public float mSell1Price;
 40     // 成交股票数,单位“股”。100股为1手。
 41     public long mTradeCount;
 42     // 成交额,单位“元”。一般需要转换成“万元”。
 43     public long mTradeMoney;
 44     // 买单情况
 45     public BuyOrSellInfo[] mBuy;
 46     // 卖单情况
 47     public BuyOrSellInfo[] mSell;
 48     // 日期
 49     public String mDate;
 50     // 时间
 51     public String mTime;
 52
 53     // 涨跌 = 现价 - 昨收 ;
 54     // 涨幅 = 涨跌 / 昨收 ;
 55     // 振幅 = (今日最高价 - 今日最低价)/昨收
 56
 57     private SinaStockInfo(String mName, float mTodayPrice,
 58             float mYestodayPrice, float mNowPrice, float mHighestPrice,
 59             float mLowestPrice, float mBuy1Price, float mSell1Price,
 60             long mTradeCount, long mTradeMoney, BuyOrSellInfo[] mBuy,
 61             BuyOrSellInfo[] mSell, String mDate, String mTime) {
 62         super();
 63         this.mName = mName;
 64         this.mTodayPrice = mTodayPrice;
 65         this.mYestodayPrice = mYestodayPrice;
 66         this.mNowPrice = mNowPrice;
 67         this.mHighestPrice = mHighestPrice;
 68         this.mLowestPrice = mLowestPrice;
 69         this.mBuy1Price = mBuy1Price;
 70         this.mSell1Price = mSell1Price;
 71         this.mTradeCount = mTradeCount;
 72         this.mTradeMoney = mTradeMoney;
 73         this.mBuy = mBuy;
 74         this.mSell = mSell;
 75         this.mDate = mDate;
 76         this.mTime = mTime;
 77     }
 78
 79     @Override
 80     public String toString() {
 81         StringBuilder sb = new StringBuilder();
 82         sb.append("股票名称: " + mName + "\n");
 83         sb.append("今日开盘价: " + mTodayPrice + "元\n");
 84         sb.append("昨日收盘价: " + mYestodayPrice + "元\n");
 85         sb.append("当前股价: " + mNowPrice + "元\n");
 86         sb.append("今日最高价: " + mHighestPrice + "元\n");
 87         sb.append("今日最低价: " + mLowestPrice + "元\n");
 88         sb.append("今日交易量: " + mTradeCount + "股\n");
 89         sb.append("今日成交量: " + mTradeMoney + "元\n");
 90
 91         BuyOrSellInfo[] buy = mBuy;
 92         sb.append("买一:\n" + buy[0] + "\n");
 93         sb.append("买二:\n" + buy[1] + "\n");
 94         sb.append("买三:\n" + buy[2] + "\n");
 95         sb.append("买四:\n" + buy[3] + "\n");
 96         sb.append("买五:\n" + buy[4] + "\n");
 97
 98         BuyOrSellInfo[] sell = mSell;
 99         sb.append("卖一:\n" + sell[0] + "\n");
100         sb.append("卖二:\n" + sell[1] + "\n");
101         sb.append("卖三:\n" + sell[2] + "\n");
102         sb.append("卖四:\n" + sell[3] + "\n");
103         sb.append("卖五:\n" + sell[4] + "\n");
104
105         sb.append("时间: " + mTime + "\n");
106         sb.append("日期: " + mDate + "\n");
107
108         return sb.toString();
109     }
110
111     /** 自定义的转换异常类 */
112     public static class ParseStockInfoException extends Exception {
113         public ParseStockInfoException() {
114             super("Parse StockInfo error!");
115         }
116     }
117
118     /**
119      * http://hq.sinajs.cn/list=sz300114,
120      * <P>
121      * 将js数据转化为bean
122      *
123      * @param source
124      *            的格式为:
125      *            <p>
126      *            var hq_str_sz300114=
127      *            "中航电测,67.930,65.250,61.250,71.500,60.500,61.240,61.250,6962845,453642618.970,4400,61.240,500,61.230,3000,61.220,13900,61.210,36290,61.200,27020,61.250,500,61.260,8080,61.300,3290,61.370,1228,61.380,2015-06-03,15:05:55,00"
128      *            ;
129      * @return
130      * @throws ParseStockInfoException
131      */
132     public static SinaStockInfo parseStockInfo(String source)
133             throws ParseStockInfoException {
134         source = source.substring(source.indexOf("\"") + 1,
135                 source.lastIndexOf(","));
136         String[] infoStr = source.split(",");
137
138         if (infoStr.length != 32) {
139             throw new ParseStockInfoException();
140         }
141
142         final String name = infoStr[0];
143         final float todayPrice = Float.parseFloat(infoStr[1]);
144         final float yestodayPrice = Float.parseFloat(infoStr[2]);
145         final float nowPrice = Float.parseFloat(infoStr[3]);
146         final float highestPrice = Float.parseFloat(infoStr[4]);
147         final float lowestPrice = Float.parseFloat(infoStr[5]);
148         final float buy1Price = Float.parseFloat(infoStr[6]);
149         final float sell1Price = Float.parseFloat(infoStr[7]);
150         final long tradeCount = Long.parseLong(infoStr[8]);
151         final long tradeMoney = Long.parseLong(infoStr[9]);
152
153         BuyOrSellInfo buy1 = new BuyOrSellInfo(Long.parseLong(infoStr[10]),
154                 Float.parseFloat(infoStr[11]));
155         BuyOrSellInfo buy2 = new BuyOrSellInfo(Long.parseLong(infoStr[12]),
156                 Float.parseFloat(infoStr[13]));
157         BuyOrSellInfo buy3 = new BuyOrSellInfo(Long.parseLong(infoStr[14]),
158                 Float.parseFloat(infoStr[15]));
159         BuyOrSellInfo buy4 = new BuyOrSellInfo(Long.parseLong(infoStr[16]),
160                 Float.parseFloat(infoStr[17]));
161         BuyOrSellInfo buy5 = new BuyOrSellInfo(Long.parseLong(infoStr[18]),
162                 Float.parseFloat(infoStr[19]));
163
164         BuyOrSellInfo sell1 = new BuyOrSellInfo(Long.parseLong(infoStr[20]),
165                 Float.parseFloat(infoStr[21]));
166         BuyOrSellInfo sell2 = new BuyOrSellInfo(Long.parseLong(infoStr[22]),
167                 Float.parseFloat(infoStr[23]));
168         BuyOrSellInfo sell3 = new BuyOrSellInfo(Long.parseLong(infoStr[24]),
169                 Float.parseFloat(infoStr[25]));
170         BuyOrSellInfo sell4 = new BuyOrSellInfo(Long.parseLong(infoStr[26]),
171                 Float.parseFloat(infoStr[27]));
172         BuyOrSellInfo sell5 = new BuyOrSellInfo(Long.parseLong(infoStr[28]),
173                 Float.parseFloat(infoStr[29]));
174
175         final String date = infoStr[30];
176         final String time = infoStr[31];
177
178         SinaStockInfo stockInfo = new SinaStockInfo(name, todayPrice,
179                 yestodayPrice, nowPrice, highestPrice, lowestPrice, buy1Price,
180                 sell1Price, tradeCount, tradeMoney, new BuyOrSellInfo[] { buy1,
181                         buy2, buy3, buy4, buy5 }, new BuyOrSellInfo[] { sell1,
182                         sell2, sell3, sell4, sell5 }, date, time);
183
184         return stockInfo;
185
186     }
187
188     /** 买单或卖单信息。 */
189     static class BuyOrSellInfo {
190         // 数量。单位为“股”。100股为1手。
191         long mCount;
192         // 价格。
193         float mPrice;
194
195         public BuyOrSellInfo(long count, float price) {
196             mCount = count;
197             mPrice = price;
198         }
199
200         @Override
201         public String toString() {
202             StringBuilder sb = new StringBuilder();
203             sb.append("数量: " + mCount + "股    ");
204             sb.append("价格: " + mPrice + "元");
205             return sb.toString();
206         }
207     }
208 }

2.客户端实例类

  1 import java.io.BufferedInputStream;
  2 import java.io.BufferedReader;
  3 import java.io.IOException;
  4 import java.io.InputStream;
  5 import java.io.InputStreamReader;
  6 import java.io.Reader;
  7 import java.nio.charset.Charset;
  8 import java.util.ArrayList;
  9 import java.util.List;
 10
 11 import org.apache.commons.httpclient.HttpClient;
 12 import org.apache.commons.httpclient.HttpException;
 13 import org.apache.commons.httpclient.HttpMethod;
 14 import org.apache.commons.httpclient.HttpStatus;
 15 import org.apache.commons.httpclient.methods.GetMethod;
 16
 17 import com.sina.stock.SinaStockInfo.ParseStockInfoException;
 18
 19 import android.R.string;
 20 import android.graphics.Bitmap;
 21 import android.graphics.BitmapFactory;
 22 import android.text.TextUtils;
 23 import android.util.Log;
 24
 25 /**
 26  * 新浪数据获取客户端,提供个股行情查询、大盘指数查询、个股分时图、K线图等基本数据查询服务。
 27  */
 28 public final class SinaStockClient {
 29
 30     private final static String STOCK_URL = "http://hq.sinajs.cn/list=";
 31
 32     private final static String STOCK_MINITE_URL = "http://image.sinajs.cn/newchart/min/n/";
 33     private final static String STOCK_DAILY_URL = "http://image.sinajs.cn/newchart/daily/n/";
 34     private final static String STOCK_WEEKLY_URL = "http://image.sinajs.cn/newchart/weekly/n/";
 35     private final static String STOCK_MONTHLY_URL = "http://image.sinajs.cn/newchart/monthly/n/";
 36
 37     public final static int IMAGE_TYPE_MINITE = 0x85;
 38     public final static int IMAGE_TYPE_DAILY = 0x86;
 39     public final static int IMAGE_TYPE_WEEKLY = 0x87;
 40     public final static int IMAGE_TYPE_MONTHLY = 0x88;
 41
 42     private final static int CONNECTION_TIMEOUT = 5000;
 43     private final static int SO_TIMEOUT = 30000;
 44
 45     private HttpClient mHttpClient;
 46
 47     private static SinaStockClient mInstance;
 48     private SinaStockClient(){
 49         mHttpClient = new HttpClient();
 50
 51         mHttpClient.getHttpConnectionManager().getParams().setConnectionTimeout(CONNECTION_TIMEOUT);
 52         mHttpClient.getHttpConnectionManager().getParams().setSoTimeout(SO_TIMEOUT);
 53
 54     }
 55
 56     /**
 57      * 获取客户端实例。
 58      *
 59      * @return SinaStockClient
 60      */
 61     public synchronized static SinaStockClient getInstance() {
 62
 63         if(mInstance != null) {
 64             return mInstance;
 65         }
 66         return new SinaStockClient();
 67     }
 68
 69     /**
 70      * 通过股票代码,获取行情信息。
 71      *
 72      * @param stockCodes
 73      *         股票代码数组。沪市股票代码以"sh+股票代码", 深市股票代码以"sz+股票代码"。
 74      *
 75      * @return 成功返回List<SinaStockInfo>,失败返回null。
 76      *
 77      * @throws IOException
 78      * @throws HttpException
 79      * @throws ParseStockInfoException
 80      */
 81     public List<SinaStockInfo> getStockInfo(String[] stockCodes) throws HttpException, IOException, ParseStockInfoException {
 82         String url = STOCK_URL + generateStockCodeRequest(stockCodes);
 83
 84         HttpMethod method = new GetMethod(url);
 85         int statusCode = mHttpClient.executeMethod(method);
 86         if(statusCode != HttpStatus.SC_OK) {
 87             method.releaseConnection();
 88             return null;
 89         }
 90
 91         InputStream is = method.getResponseBodyAsStream();
 92         InputStreamReader reader = new InputStreamReader(new BufferedInputStream(is), Charset.forName("gbk"));
 93         BufferedReader bReader = new BufferedReader(reader);
 94
 95         List<SinaStockInfo> list = parseSinaStockInfosFromReader(bReader);
 96         bReader.close();
 97         method.releaseConnection();
 98
 99         return list;
100     }
101
102     /**
103      * 获取股票分时图或K线图。
104      *
105      * @param stockCode
106      *         股票代码。沪市股票代码以"sh+股票代码", 深市股票代码以"sz+股票代码"。
107      * @param imageType
108      *         指明请求的图像类型。
109      *         IMAGE_TYPE_MINITE 为分时图。
110      *         IMAGE_TYPE_DAILY 为日K线图。
111      *         IMAGE_TYPE_WEEKLY 为周K线图。
112      *         IMAGE_TYPE_MONTHLY 为月K线图。
113      * @return 如果成功则返回Bitmap图像,失败返回null。
114      * @throws IOException
115      * @throws HttpException
116      */
117     public Bitmap getStockImage(String stockCode, int imageType) throws HttpException, IOException {
118         String baseRequestUrl = null;
119         switch(imageType) {
120         case IMAGE_TYPE_MINITE:
121             baseRequestUrl = STOCK_MINITE_URL;
122             break;
123         case IMAGE_TYPE_DAILY:
124             baseRequestUrl = STOCK_DAILY_URL;
125             break;
126         case IMAGE_TYPE_WEEKLY:
127             baseRequestUrl = STOCK_WEEKLY_URL;
128             break;
129         case IMAGE_TYPE_MONTHLY:
130             baseRequestUrl = STOCK_MONTHLY_URL;
131             break;
132         }
133
134         if(TextUtils.isEmpty(baseRequestUrl)) {
135             return null;
136         }
137
138         String fullRequestUrl = baseRequestUrl + stockCode + ".gif";
139
140         return getBitmapFromUrl(fullRequestUrl);
141     }
142
143     private String generateStockCodeRequest(String[] stockCodes){
144
145         if(stockCodes == null || stockCodes.length == 0) {
146             return null;
147         }
148
149         StringBuilder sb = new StringBuilder(stockCodes[0]);
150         final int length = stockCodes.length;
151
152         for(int i = 1; i != length; ++i) {
153             sb.append(‘,‘);
154             sb.append(stockCodes[i]);
155         }
156
157         return sb.toString();
158     }
159
160     private List<SinaStockInfo> parseSinaStockInfosFromReader(BufferedReader reader) throws IOException, ParseStockInfoException {
161
162         ArrayList<SinaStockInfo> list = new ArrayList<SinaStockInfo>(10);
163         String sourceLine = null;
164
165         while((sourceLine = reader.readLine()) != null) {
166             list.add(SinaStockInfo.parseStockInfo(sourceLine));
167         }
168
169         return list;
170     }
171
172     private Bitmap getBitmapFromUrl(String url) throws HttpException, IOException {
173
174         HttpMethod method = new GetMethod(url);
175         int statusCode = mHttpClient.executeMethod(method);
176         if(statusCode != HttpStatus.SC_OK) {
177             method.releaseConnection();
178             return null;
179         }
180
181         InputStream in = method.getResponseBodyAsStream();
182         BufferedInputStream bis = new BufferedInputStream(in);
183
184         Bitmap bm = BitmapFactory.decodeStream(bis);
185
186         bis.close();
187         method.releaseConnection();
188
189         return bm;
190     }
191 }

参考http://www.blogjava.net/zh-weir/archive/2012/03/01/371105.html

时间: 2024-10-06 18:32:59

andoid下的股票行情开发的相关文章

iOS 开发 - 查看股票行情

这几天做了一个查看股票行情的app. 完成之后,当k线比较多的时候,app 对于捏合.拖动手势的反应不太流畅, 主要原因是drawRect: 干的活太多. 最后按照下面这些原则,进行调整修改,流畅度提高不少 总结如下: 1. 尽量不用drawRect: 2. 如果必须使用,drawRect:中的代码应少而高效,不应有太耗时的代码. - 在setNeedDisplay之前,就将绘图相关的计算,初始化,内存分配完成,在drawRect:中直接使用. - 避免绘制string,如果方便,使用UILab

Jlink V7在MDK下使用Cortex-M3-Jlink模式开发STM32的说明

Jlink V7在MDK下使用Cortex-M3-Jlink模式开发STM32的说明 开发环境:STM32F103RB(128K Flash 20K RAM)+MDK3.50+JLINK V7(v4.04) mdk3.50 新增一种cortex-ms-Jlink调试模式,可以很好地支持Jlink.Jlink-SWD调试,无RDI需要按复位的缺点.烧写速度比RDI慢一些. 1 软件安装 1.1 安装Segger jlink V4.04驱动 安装在c:\Program Files\SEGGER\JL

Linux下快速搭建php开发环境

php开发环境快速搭建 一.Linux下快速搭建php开发环境 1.安装XAMPP for Linux XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,使用XAMPP可快速搭建PHP开发环境.下载链接:https://www.apachefriends.org/download.html  进入下载界面选择XAMPP for Linux下载 启动终端输入命令  cd /下载xampp保存的路径.我的保存路径是:/home/coderose/下载.更改安装程

第9节课笔记-彻底实战IntelliJ IDEA 下的Spark程序开发

彻底实战IntelliJ IDEA 下的Spark程序开发下载IntelliJ IDEA 下载gitSpark源码下载:git clone git://github.com/apache/spark.git导入maven 工程 IntelliJ IDEA 启动的向导中Sacal下载需要下载,这是IDEA下载的,和系统层的不一样4.指定JDK1.8.x和Scala2.10.45.file ->Project Stucture 来设置工程lib 核心是添加Spark的jar6.添加Spark jar

Win7下搭建安卓android开发环境

本文出自 "孤狼" 博客,请务必保留此出处http://332374363.blog.51cto.com/5262696/1310882 另外,在搭建android开发环境时,还参考了http://www.apkbus.com/android-641-1-1.html 参考了:http://wenku.baidu.com/view/6108ac19b7360b4c2f3f6406.html 一.假设你现在什么都没有,那么你需要下载以下的东西: 1.JDK(JavaDevelopment

Windows下搭建objective C开发环境

最近打算针对iPhone.iPod touch和iPad开发一些应用,所以,需要开始学习Objective C(苹果推出的类似C语言的开发语言).由于苹果的自我封闭的产业链发展模式(从芯片.机器.开发语言.终端产品.服务)的限制,要想开发针对苹果 iPhone等产品的应用程序,就需要用Mac机器,在Xcode的IDE上使用Objective C语言开发.Mac机器就不用说了,那比PC机器要贵不少(当然性价比还是很高的),所以,要想廉价方式学习Objective C就必须要在Windows上能搭建

《Node.js入门》Windows 7下Node.js Web开发环境搭建笔记

近期想尝试一下在IBM Bluemix上使用Node.js创建Web应用程序.所以须要在本地搭建Node.js Web的开发測试环境. 这里讲的是Windows下的搭建方法,使用CentOS 的小伙伴请參考:<Node.js入门>CentOS 6.5下Node.js Web开发环境搭建笔记 Node.js是什么? 我们看看百科里怎么说的? JavaScript是一种执行在浏览器的脚本,它简单,轻巧.易于编辑,这样的脚本通经常使用于浏览器的前端编程.可是一位开发人员Ryan有一天发现这样的前端式

Ubuntu Linux下如何配置Android开发环境

下载和安装Win7系统Android开发环境中讲了怎样在Win7系统中安装Android开发环境,那么怎样在Linux系统中配置Android开发环境呢?本篇文章就将演示如何使用Eclipse.Android SDK和PhoneGap在Ubuntu 11.04环境下配置Android开发环境. 以下是在Ubuntu linux系统中配置Android开发环境的几个步骤:        1.安装Eclipse和Android SDK/PhoneGap所需软件包: 打开终端,输入下面命令完成题目所述

MAC下Android的Eclipse开发环境的搭建

一.Eclipse的下载 到网站:http://www.eclipse.org/downloads/ 上,由于我们是用Java开发的所以步骤如下: 找到"Eclipse IDE for java Developers"此处右上角会根据你当前使用的系统自动选择,Mac下就会自动选择位"Mac OS X(Cocoa)" 然后点击右边的"Mac OS X 64bit"(这里我的Pro是i5处理器可以用64位的),根据你的机器也可以选择"Mac