使用Volley做传输的时候遇到的坑:
- 使用RequestQueue的时候不要一开始以直接声明,因为它要传入Context参数才行
比如一开始就这么写 public RequestQueue queue = Volley.newRequestQueue(this);
这么做的结果是直接闪退,因为this还没有在实例化为Activity,所以我们应该先声明,然后在生命周期方法中初始化它,而且因为涉及到了网络,最好使用单例模式。
- 传递数据给服务器
使用JsonObjectRequest直接传递,要传输的数据转化为JsonObject作为参数,服务器返回的数据会在监听器的回调方法中获得
例如:
User user = new User();
user.setUsername(params[0]);
user.setPhoneNumber(params[1]);
user.setPassword(params[2]);
Message message = new Message(UserStatic.REGISTER_REQUEST, user);
JSONObject object = JsonUtils.convertObjectToJsonObject(message);
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, MainActivity.URL,
object, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
waitJsonResponse = false;
try {
switch((int)response.get(MESSAGE_TYPE)){
case UserStatic.REGISTER_SUCCESS:
Toast.makeText(RegisterActivity.this, "Register success", Toast.LENGTH_SHORT).show();
break;
case UserStatic.USERNAME_IS_ALREADY_EXIST:
Toast.makeText(RegisterActivity.this, "Username already exits", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(RegisterActivity.this, "Match Error", Toast.LENGTH_SHORT).show();
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
waitJsonResponse = false;
Toast.makeText(RegisterActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
}
});
MySingleQueue.getInstance(RegisterActivity.this).add(request);