金融软件价格刷新的一种实现方式

金融软件价格刷新的一种实现方式_第1张图片
price.2019-12-03 11_58_17.gif

实现思路

  • 新价格跟老价格对比,定义三个状态--上涨/不变/下跌。
  • 数据刷新使用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 storeOldPricesAndInitState(@NonNull List items) {
        Map 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 storeOldPricesAndInitState(Map oldPriceMap, @NonNull List 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上

你可能感兴趣的:(金融软件价格刷新的一种实现方式)