美文网首页
金融软件价格刷新的一种实现方式

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

作者: 成虫_62d0 | 来源:发表于2019-12-03 15:07 被阅读0次
    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<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上

    相关文章

      网友评论

          本文标题:金融软件价格刷新的一种实现方式

          本文链接:https://www.haomeiwen.com/subject/iulcgctx.html