Volley问题

 相信volley绝大部分做android的人已经知道了,关于volley的使用网上也是一抓一大把,都是说volley如何如何好用,下面分享下自己在使用volley过程中踩过的坑。

  volley好用的一个原因是封装的api看起来也比较直接,但是其回调的api做的是一般般,其中有一个JsonObjectRequest类,网上的使用说明也一大把,基本上都是最简单的情形:

Get请求示例:

RequestQueue queue = Volley.newRequestQueue(this);
String url = "http://m.weather.com.cn/data/101201401.html";
JsonObjectRequest objRequest = new JsonObjectRequest(url, null,
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject obj) {
                System.out.println("----------:" + obj);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.getMessage();
            }

        });
objRequest.setTag("obj");
queue.add(objRequest);

Post请求示例:

Map<String,String> map=new HashMap<String,String>();
map.put("token", "AbCdEfGh123456");
JSONObject params=new JSONObject(map);
         
RequestQueue queue = Volley.newRequestQueue(this);
String url = "http://m.weather.com.cn/data/101201401.html";
JsonObjectRequest objRequest = new JsonObjectRequest(url, params,
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject obj) {
                System.out.println("----------:" + obj);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.getMessage();
            }
        });

上面的两个例子是使用的最简单的情形,就是Get和Post请求都没有带上参数,于是百度这个问题得到的答案都是说通过JsonObjectRequest的JsonObject jsonRequest这个参数来指定,官方的文档对这个参数说的也是不清不楚的,这个地方看了半天也想不通参数为什么会是用json对象来传递,不应该是key=value的形式吗?又多百度了几遍,说是通过自定义JsonObjectRequest然后通过override其getParams函数来指定,但照做后这个函数不会被调用。。。百般无奈下只能看源码了,看了源码才发现JsonObjectRequest的构造函数里的jsonRequest参数其实最终把JsonObject转换成String,如果这个对象是空的,那么会默认以get请求(除非你指定是用post),否则这个参数会当做是post的参数!看源码:

//JsonRequest.java
@Override
public byte[] getBody() {
    try {
        return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
    } catch (UnsupportedEncodingException uee) {
        VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
        mRequestBody, PROTOCOL_CHARSET);
        return null;
    }
}

具体getBody在哪里被调用就不具体来培析,有兴趣的可自己研究源码,看到这个,如果是说想继承JsonOjectRequest又想用key=value&key1=value1的形式来做参数的话肯定是想到了自定义的类里构造mRequestBody也就是JsonObject转换成String的地方用String(key=value形式)来代替用JsonObject来传递。于是做了如下修改:

String query = "";
if (mParams != null) {
    Uri uri = Uri.parse(mUrl);
    Uri.Builder builder = uri.buildUpon();
    for (HashMap.Entry<String, String> entry : mParams.entrySet()) {
         builder.appendQueryParameter(entry.getKey(), entry.getValue());
    }
    query  = builder.build().getEncodedQuery();
} else {
}
mRequest = new MyJsonObjectRequest(mUrl, query, this, this);
//MyJsonObjectRequest.java 继承JsonObjectRequest
public MyJsonObjectRequest(String url, String params, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
       super(Method.POST, url, params, listener, errorListener);
}

但最终还是不行!为什么? 参数传递没有错误啊?事实上这里忘了一个非常重要的地方,也就是post请求的header,在发起key=value形式的参数时,我们请求的Content-Type应该是application/x-www-form-urlencoded的,而JsonRequest默认是application/json; charset=%s,这就是真相,于是重写getBodyContentType

@Override
public String getBodyContentType() {
    if (getMethod() == Method.POST) {
        return "application/x-www-form-urlencoded";
    }
    return super.getBodyContentType();
}

搞定了!

这里是不是还有人在想get请求如何传参数的?用这种方式怎么get请求不能传参,其实也是非常简单,在请求时url就带上key=value就好!如:

 if (mParams != null) {
        Uri uri = Uri.parse(url);
        Uri.Builder builder = uri.buildUpon();
         for (HashMap.Entry<String, String> entry : mParams.entrySet()) {
            builder.appendQueryParameter(entry.getKey(), entry.getValue());
        }
        mUrl = builder.build().toString();
} else {
        mUrl = url;
}

聪明的你肯定想到了吧,希望给同样用volley的同学有帮助~~

数据心机房是现代信息技术的核心设施,它承载着企业的重要数据和服务,因此,其基础设计与规划至关重要。在制定这样的方案时,需要考虑的因素繁多,包括但不限于以下几点: 1. **容量规划**:必须根据业务需求预测未来几年的数据处理和存储需求,合理规划机房的规模和设备容量。这涉及到服务器的数量、存储设备的容量以及网络带宽的需求等。 2. **电力供应**:数据心是能源消耗大户,因此电力供应设计是关键。要考虑不间断电源(UPS)、备用发电机的容量,以及高效节能的电力分配系统,确保电力的稳定供应并降低能耗。 3. **冷却系统**:由于设备密集运行,散热问题不容忽视。合理的空调布局和冷却系统设计可以有效控制机房温度,避免设备过热引发故障。 4. **物理安全**:包括防火、防盗、防震、防潮等措施。需要设计防火分区、安装烟雾探测和自动灭火系统,设置访问控制系统,确保只有授权人员能进入。 5. **网络架构**:规划高速、稳定、冗余的网络架构,考虑使用光纤、以太网等技术,构建层次化网络,保证数据传输的高效性和安全性。 6. **运维管理**:设计易于管理和维护的IT基础设施,例如模块化设计便于扩展,集监控系统可以实时查看设备状态,及时发现并解决问题。 7. **绿色数据心**:随着环保意识的提升,绿色数据心成为趋势。采用节能设备,利用自然冷源,以及优化能源管理策略,实现低能耗和低碳排放。 8. **灾难恢复**:考虑备份和恢复策略,建立异地灾备心,确保在主数据心发生故障时,业务能够快速恢复。 9. **法规遵从**:需遵循国家和地区的相关法律法规,如信息安全、数据保护和环境保护等,确保数据心的合法运营。 10. **扩展性**:设计时应考虑到未来的业务发展和技术进步,保证机房有充足的扩展空间和升级能力。 技术创新在数据心机房基础设计及规划方案扮演了重要角色。例如,采用虚拟化技术可以提高硬件资源利用率,软件定义网络(SDN)提供更灵活的网络管理,人工智能和机器学习则有助于优化能源管理和故障预测。 总结来说,一个完整且高效的数据心机房设计及规划方案,不仅需要满足当前的技术需求和业务目标,还需要具备前瞻性和可持续性,以适应快速变化的IT环境和未来可能的技术革新。同时,也要注重经济效益,平衡投资成本与长期运营成本,实现数据心的高效、安全和绿色运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值