论坛首页 移动开发技术论坛

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

浏览 3611 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-11-28   最后修改:2010-11-28
业务背景: 海量高频数据(如股票实时报价), 更新的规则: 被更新的对象和更新方法都不一样.


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


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();
       		
        
        
     
    }
}



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

   发表时间:2010-12-03  
谢谢了,下来看看注释再多点就完美了。
0 请登录后投票
   发表时间:2010-12-12  
好吧.我承认.我看不太懂..
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics