Android深拷贝

释放双眼,带上耳机,听听看~!

我要连续调用三个接口,给每一个接口都传一个字典作为参数,这个字典包括基础的参数,在每一个接口里边又有自己的参数:

 

    /*封装参数*/
    void createParaDic(){
        HashMap<String,Object> paraDic = new HashMap<>();
        paraDic.put("para1","para1");
        paraDic.put("para2","para2");
        paraDic.put("para3","para3");
        
        requestA(paraDic);
        requestB(paraDic);
        requestC(paraDic);
    }

    /*网络请求A*/
    void requestA(HashMap<String,Object> paraDic){
        paraDic.put("para3","A");
        //开始网络请求
    }

    /*网络请求B*/
    void requestB(HashMap<String,Object> paraDic){
        paraDic.put("para3","B");
        //开始网络请求
    }

    /*网络请求C*/
    void requestC(HashMap<String,Object> paraDic){
        paraDic.put("para3","C");
        //开始网络请求
    }

这个时候虽然网络请求成功不受影响,但是如果想在网络请求成功之后打印出来参数和返回值,那么方法A、B、C打印出来的参数都是

 

para3 = C

这会对我们分析日志造成误导,那么我们在给每一个方法传值时都是用深拷贝就可以解决这个问题了,深拷贝代码如下

 

    /**
     * 对象深度复制(对象必须是实现了Serializable接口)
     *
     * @param obj
     * @return T
     * @author Muscleape
     * @date 2018/8/10 14:39
     */
    ("unchecked")
    public static <T extends Serializable> T customerClone(T obj) {
        T clonedObj = null;
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(obj);
            oos.close();

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            clonedObj = (T) ois.readObject();
            ois.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return clonedObj;
    }

我们的实现方法改成如下:

 

    /*封装参数*/
    void createParaDic(){
        HashMap<String,Object> paraDic = new HashMap<>();
        paraDic.put("para1","para1");
        paraDic.put("para2","para2");
        paraDic.put("para3","para3");

        HashMap<String,Object> paraA = Utils.customerClone(paraDic);
        requestA(paraA);

        HashMap<String,Object> paraB = Utils.customerClone(paraDic);
        requestB(paraB);

        HashMap<String,Object> paraC = Utils.customerClone(paraDic);
        requestC(paraC);
    }

    /*网络请求A*/
    void requestA(HashMap<String,Object> paraDic){
        paraDic.put("para3","A");
        //开始网络请求
    }
    /*网络请求B*/
    void requestB(HashMap<String,Object> paraDic){
        paraDic.put("para3","B");
        //开始网络请求
    }
    /*网络请求C*/
    void requestC(HashMap<String,Object> paraDic){
        paraDic.put("para3","C");
        //开始网络请求
    }

⚠️如果参数中有我们自己定义的对象,那么这个对象必须是实现了Serializable接口

参考文章
http://www.jishudog.com/6885/html

 

人已赞赏
Android文章

Android加载网络图片并显示占位图

2019-12-19 10:57:13

Android文章

Android EditText自动获取焦点并弹出软键盘,解决EditText在获取光标时不弹出软键盘的问题

2019-12-19 16:59:20

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索