`

用代理模式处理海量高频数据更新

阅读更多
业务背景: 海量高频数据(如股票实时报价), 更新的规则: 被更新的对象和更新方法都不一样.


下面是部分实例代码,最后一个是模拟的数据更新。


public interface CommonDefn {
	
	public static int  HIGHLIGHT_BACKGROUND_COLOR_INDEX = 0xff0033ff;
	
	public class DoThingsReturn{
		public Object cmd;
		public Object data;
		public int errCode;
		public DoThingsReturn(Object cmd, Object data, int errorCode) {
			super();
			this.cmd = cmd;
			this.data = data;
			this.errCode = errorCode;
		}
	}
}



/**
 *  used  for updating  the  background of the view while the data changed
 * 
 *
 */
public  interface RefreshHandlerInterface {
		public void updateBackground(Object handlerId, int color); //the proxy updating method
		public Handler getHandler();  //the proxy handler
}


/**
 * 
 * decrease alpha channel value from 255 to 0.
 *
 */
public class ColorRefreshTask extends TimerTask {
	private RefreshHandlerInterface refreshHandler;
	private final static int  DELAY_ONCE =200;
	private final static int TOTAL_RUNTIME = 1500;
	private final static int POWER_16_16 = 16 * 16* 16 * 16 * 16 * 16;
	private final static int INCREASE_ONCE =  0xff / (TOTAL_RUNTIME / DELAY_ONCE);
	private int color;
	private Object id;
	private int startTime;
	private int alphaChannel;
	
	/**
	 * 
	 * @param color ( current background color)
	 * @param id  id of the updated view
	 */
	public ColorRefreshTask(RefreshHandlerInterface refreshHandler, int color, Object id) {
		super();
		Log.d("color", "ready to set color!");
		this.color = color;
		this.id = id;
		this.startTime = 0;
		this.alphaChannel = 0;
		this.refreshHandler = refreshHandler;
	}
	
	public void run(){
		
		int colorComm = color - 0xff000000;  //RGB color value;
		int currColor = 0;
		
		if(startTime < TOTAL_RUNTIME) {
				startTime +=  DELAY_ONCE;
				alphaChannel +=  INCREASE_ONCE;
				currColor = POWER_16_16 *  alphaChannel  + colorComm;
				//Log.d("color", Integer.toHexString(currColor));
				sendMsg(currColor);
				refreshHandler.getHandler().postDelayed(this,DELAY_ONCE);
				
		}
		else {
			sendMsg(currColor <= color ? color : 0 );
			cancel();
		}
		
	
	}
	
	public void startTimer(){
		refreshHandler.getHandler().postDelayed(this,DELAY_ONCE);
	}
	
	
	private void sendMsg(final int currColor){
		final Runnable myUpdateResults = new Runnable() {
	        public void run() {
	        	refreshHandler.updateBackground( id, currColor);
	        }
	    };
	    
	     new Thread() {
            public void run() {
            	refreshHandler.getHandler().post(myUpdateResults);
            }
        }.start();
		
	}
	
	public void stopTimer(){
		  this.cancel();
	}
	
	
}



import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.TextView;

public class TestActivity extends Activity implements RefreshHandlerInterface{
	
	private  Handler  _messageHandler = new Handler();
	
	@Override
	public Handler getHandler() {
		return _messageHandler;
	}
	


	@Override
	public void updateBackground(Object handlerId, int color) {
		if(!( handlerId instanceof CommonDefn.DoThingsReturn)) {
			return;    //invalid parameter
		}
		else {
			
			   
				TextView  current = (TextView)(((CommonDefn.DoThingsReturn)handlerId).data);
				   if(current.getVisibility() != View.VISIBLE) {
					   return;           //no need to update  for the view
				   }
					if(color<=0) {
						current.setBackgroundDrawable(null);
						current.setText(((CommonDefn.DoThingsReturn)handlerId).cmd.toString());
					}
					else {
						current.setBackgroundColor( color);
					}
					current.postInvalidate();
		}
		
	}
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
       
        final TextView tv = (TextView)findViewById(R.id.txtview);
        
        
        new Thread() {
        	  java.util.Random rand =  new java.util.Random();
        	  long lastUpdate = System.currentTimeMillis();
        	 
		          public void run() {
		            while(!Thread.interrupted() || !TestActivity.this.isFinishing()) {
		                //模拟高频更新数据
		            	if( System.currentTimeMillis() - lastUpdate < 2000l)  { //设置两次动画的最少间隔时间
		            		continue;
		            	}
		            	else 
		            		lastUpdate = System.currentTimeMillis();
		            	CommonDefn.DoThingsReturn  updateWrapper = new CommonDefn.DoThingsReturn(String.valueOf(rand.nextInt()) , tv,0);
			        	ColorRefreshTask refresh = new ColorRefreshTask(TestActivity.this,CommonDefn.HIGHLIGHT_BACKGROUND_COLOR_INDEX, updateWrapper);
		        		_messageHandler.postDelayed(refresh, 200);  //ready to for the current updating
		        		
		        		
		            }
		          }
		      }.start();
       		
        
        
     
    }
}



这也也打包了,需要的可以看一下。

分享到:
评论
2 楼 Coding.Ghost 2010-12-12  
好吧.我承认.我看不太懂..
1 楼 sungod 2010-12-03  
谢谢了,下来看看注释再多点就完美了。

相关推荐

    R处理金融高频数据

    通过使用R语言及其“highfrequency”包,我们可以有效地处理金融市场的高频数据,进而进行深入的市场分析和策略开发。高频数据的应用领域广泛,包括但不限于股票买卖报价的动态性分析、市场流动性的评估、算法交易...

    用R语言进行高频数据分析

    用R语言进行高频数据分析,讲解通俗易通,条理清晰,能使读者快速入门

    中国宏观经济高频数据手册20220415.xlsx

    中国宏观经济高频数据手册20220415.xlsx中国宏观经济高频数据手册20220415.xlsx中国宏观经济高频数据手册20220415.xlsx中国宏观经济高频数据手册20220415.xlsx

    高频金融数据的研究现状及展望(1).zip

    【压缩包子文件的文件名称列表】:其中的“高频金融数据的研究现状及展望.doc”文档,预示着它将详细探讨高频金融数据的最新研究成果,包括数据采集技术、处理方法、市场微观结构分析、统计模型的应用,以及这些数据...

    matlab开发-用高频数据预测EFTSe100,与FreizedMeasures比较

    在本项目中,我们主要探讨的是使用MATLAB进行高频数据的预测分析,特别是针对EFTSe100指数。MATLAB是一种强大的编程环境,广泛应用于数值计算、数据分析和建模,尤其适合处理复杂的金融问题。这里,我们将研究如何...

    20210428-海通证券-高频数据应用系列研究(一):使用高频数据跟踪核心资产的公募基金持仓变化.pdf

    海通证券发布的这篇报告探讨了如何利用高频数据来跟踪和分析公募基金在核心资产上的持仓变化。高频数据指的是以高频率收集和分析的数据,这在金融市场分析中具有重要的应用价值。本报告首先回顾了之前的研究成果,并...

    5分钟高频数据.xlsx

    沪深300股指期货2011年1月4日至2019年12月31日的5分钟高频交易数据,包括收盘价、最高价、最低价、开盘价、交易量以及交易额等数据

    【R代码】如何用R获取沪深股票高频数据和股指数据

    本篇文章将深入探讨如何使用R语言获取沪深股市的高频数据和股指数据,为你的投资决策提供科学依据。 首先,我们需要了解R语言中用于处理金融数据的主要包,如`quantmod`、`tseries`、`FinancialInstrument`、`...

    c语言如何对海量数据进行处理

    【C语言处理海量数据】 在处理海量数据时,由于内存限制,C语言通常采用外部排序、分布式计算或数据结构优化等方法。以下是一些具体的策略: 1. **寻找共同URL**: - **分治法**:将大文件拆分为多个小文件,然后...

    20130405_批量下载高频IGS站数据_

    标题“20130405_批量下载高频IGS站数据_”指的是一个关于在2013年4月5日进行的...这些脚本的使用需要一定的Linux和GNSS数据处理知识,但它们为研究者提供了一个高效的方式来获取和准备用于地球动力学分析的宝贵数据。

    海量数据处理

    - 对于海量日志数据,首先筛选出特定日期访问百度的IP,然后使用类似的方法(如模运算)将IP分散到多个小文件,统计每个文件中IP的出现频率,找出最高频的IP。 这些方法的核心思想是通过哈希函数、分布式计算、...

    高频数据 SH000004-----分笔交易

    标题中的“高频数据 SH000004-----分笔交易”指的是针对上海交易所工业指数(SH000004)的一种特定交易数据类型,即高频数据的分笔交易记录。高频数据是指在短时间内收集的大量交易数据,通常涵盖每笔交易的详细信息...

    “高频寻踪”系列之二:轻装上阵,高频数据因子的应用.zip

    - **数据处理能力**:海量高频数据需要强大的计算资源和高效的处理方法。 - **噪声过滤**:高频数据可能存在噪音,需要有效的方法进行清洗和信号提取。 - **法规限制**:不同市场的监管环境对高频交易有不同规定...

    中国民航甚高频数据通信系统

    中国民航甚高频数据通信系统(VHF Data Communication System,简称ACARS)是中国民航总局与七大骨干航空公司合作建立的全国覆盖的通信网络,是世界上第三大地空数据通信网。该系统旨在解决飞机在飞行中与航空公司及...

Global site tag (gtag.js) - Google Analytics