购物车流程

Android程序员面试宝典

  • 一分钟实现购物车加减控件
  • 京东地址管理
    购物车流程_第1张图片

配套视频

http://www.toutiao.com/i6430922823799144961/

第一步 : 既然购物肯定首先得弄个车,一般我们去超市购物肯定得弄辆小车车,所以车首先需要单例,不然我买个东西弄两个车,有点小夸张。

 public volatile static WeakReference sInstance = null;
 public static CarProvider getInstance(Context context) {

        if(sInstance == null || sInstance.get() == null){

            synchronized (CarProvider.class){
                if(sInstance == null || sInstance.get() == null){
                    sInstance = new WeakReference(new CarProvider(context.getApplicationContext()));
                }
            }
        }

        return sInstance.get();
    }

第二步 : 购买商品,首先判断是否已经购买过当前商品,如果已经购买了直接+1,如果第一次购买直接往内存里面添加。

private SparseArray mSparseArray = null;
private void put(Shopping shopping) {
        //获取内存里面的商品
        Shopping shop = mSparseArray.get(shopping.id);
        //判断当前的商品内存当中是否已经存在
        if(shop != null){
            shop.count++;
        }else{
            mSparseArray.put(shopping.id,shopping);
        }
        //保存到本地,进行持久化操作
        saveAllGoodsLocal();
    }

第三步 : 既然买了东西肯定需要计算价格,价格 = 商品 * 数量,小学老师教的还不错,计算价格首先得判断当前小车车里面的商品是否已经被勾选了,只有勾选之后的商品才能进行购买。

  public double getCarTotalPrice() {
        double tempTotalPrice = 0;
        int goodsSize = mSparseArray.size();
        for (int i = 0; i < goodsSize; i++) {
            ShopingCar tempCar = mSparseArray.get(mSparseArray.keyAt(i));
            if (tempCar.isChecked) {
                tempTotalPrice = Arith.add(tempTotalPrice, Arith.mul(tempCar.price, tempCar.count));
            }
        }
        return tempTotalPrice;
    } 

第四步 :在计算价格的时候需要注意,java当中容易丢失精度,所以需要使用BigDecimal进行计算

public class Arith {
    //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;

    //这个类不能实例化
    private Arith() {
    }

    /**
     * 提供精确的加法运算。
     *
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */

    public static double add(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确的减法运算。
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */

    public static double sub(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
     * 小数点以后10位,以后的数字四舍五入。
     *
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    public static double div(double v1, double v2) {
        return div(v1, v2, DEF_DIV_SCALE);
    }

    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入。
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1, double v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的小数位四舍五入处理。
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}
  • 欢迎关注微信公众号、长期为您推荐优秀博文、开源项目、视频

  • 微信公众号名称:Android干货程序员

  • 购物车流程_第2张图片

你可能感兴趣的:(购物车流程)