实现思路
- 新价格跟老价格对比,定义三个状态--上涨/不变/下跌。
- 数据刷新使用websocket长连接进行实时刷新。
- 频率控制--websocket有的时候推数据太快,客户端有时候处理不过来,造成ui卡顿,这个时候可以使用Rxjava的debounce/throttleFirst等操作符进行控制。
- 根据价格的三个状态(上涨/不变/下跌)进行ui刷新。
编码实现
- 抽象实体接口
根据上面的实现思路,价格状态主要是根据同一个实体的新/老 价格进行对比得到。那么使用Map数据结构是合适的,实体根据自己的需求提供key,map的value就是“价格”。
代码如下:
public interface IPrice {
/**
* 价格上涨
*/
int STATE_UP = 1;
/**
* 价格不变
*/
int STATE_STABLE = 2;
/**
* 价格下跌
*/
int STATE_DOWN = 3;
/**
* 不同类型的实体自己生成对应的key
* @return
*/
String generateKey();
/**
* 设置价格涨跌状态
* @param state
*/
void setPriceState(int state);
/**
* 得到价格涨跌状态
* @return
*/
int getPriceChangeState();
/**
* 得到价格数据
* @return
*/
String getPriceStr();
/**
* 设置价格数据
* @param priceStr
*/
void setPriceStr(String priceStr);
/**
* 对比新旧价格
* @param priceStr
* @param oldPrice
*/
void compareOldPrice(String priceStr, String oldPrice);
}
- 价格对比工具类的实现
public class PriceStateCompat {
private static PriceStateCompat instance;
private PriceStateCompat(){}
public static PriceStateCompat getInstance(){
if (instance == null) {
instance = new PriceStateCompat();
}
return instance;
}
public static Map<String, String> storeOldPricesAndInitState(@NonNull List<? extends IPrice> items) {
Map<String, String> oldPriceMap = new HashMap<>();
int size = items.size();
for (int i = 0; i < size; i++) {
IPrice item = items.get(i);
oldPriceMap.put(item.generateKey(), item.getPriceStr());
}
return oldPriceMap;
}
public static Map<String, String> storeOldPricesAndInitState(Map<String, String> oldPriceMap, @NonNull List<? extends IPrice> items) {
if (oldPriceMap == null) {
oldPriceMap = new HashMap<>();
}
int size = items.size();
for (int i = 0; i < size; i++) {
IPrice item = items.get(i);
item.setPriceStr(item.getPriceStr());
String oldPrice = oldPriceMap.get(item.generateKey());
if (!TextUtils.isEmpty(oldPrice)) {
item.compareOldPrice(item.getPriceStr(), oldPrice);
}
oldPriceMap.put(item.generateKey(), item.getPriceStr());
}
return oldPriceMap;
}
public static void startAnimation(ImageView imageView, Drawable drawable, IPrice bean) {
imageView.setImageDrawable(drawable);
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
alphaAnimation.setDuration(1500);
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
imageView.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
imageView.startAnimation(alphaAnimation);
bean.setPriceState(IPrice.STATE_STABLE);
}
public static void startAnimation(ImageView imageView, Drawable drawable, IPrice bean, int visibility) {
imageView.setImageDrawable(drawable);
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
alphaAnimation.setDuration(1500);
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
imageView.setVisibility(visibility);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
imageView.startAnimation(alphaAnimation);
bean.setPriceState(IPrice.STATE_STABLE);
}
}
剩下的工作就是数据请求-》从map中对比老的数据-》更新价格状态-》渲染到ui上
网友评论