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

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


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


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




}
}



这也也打包了,需要的可以看一下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值