Volley所遇到的坑

时间:2022-11-25 21:09:52

使用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);