这几个月接触了几个项目,对于网络这一块都需要进行会话的保持,这样做也有很多好处,比如说请求的时候我们可以不用携带用户相关的敏感数据而服务端就能够识别,这里涉及到session和cookie相关不做介绍.
在这里我们需要关注的主要有两个方法.
第一个是parseNetworkResponse,显而易见的这里我们需要将网络返回的二进制数据解析封装成我们需要的java实体类,这个方法的调用时在子线程执行的,在这个解析数据可以避免界面卡顿.
第二个是deliverResponse,这里对结果数据进行一次分发,这个数ui线程执行的,我们可以在这里对网络返回的结果进行一次统一的过滤,比如所登录失效了,这是在每个接口都有可能返回的,在这里过滤可以减少工作量,如果不需要截断,调用listener的onResponse返回结果
@Override protected Response<T> parseNetworkResponse(NetworkResponse response) { T t = null; if (response.statusCode == 200) { try { String c = response.headers.get("set-Cookie"); if (c != null) cookie = response.headers.get("set-Cookie"); String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers, Constant.CHARSET)); L.e("接口返回的json数据:", json + ""); JSONObject root = new JSONObject(json); errorCode = root.getInt("errorCode"); massage = root.getString("massage"); if (errorCode == RESPONSE_CODE_SUCCEED && (entyty != null || type != null)) { String entityJson = root.getString("entity"); t = JsonUtils.getGson().fromJson(entityJson, entyty != null ? entyty : type); } } catch (JSONException | UnsupportedEncodingException e) { e.printStackTrace(); return Response.error(new ParseError()); } return Response.success(t, HttpHeaderParser.parseCacheHeaders(response)); } else { L.i("GsonRequest", "网络异常,errorCode:" + response.statusCode); return Response.error(new NetworkError(response)); } } @Override protected void deliverResponse(T response) { switch (errorCode) { case RESPONSE_CODE_LOGIN_SUCCEED://登录成功 distribute.onResponse(response); new CarchHandle(context).sendToService(); break; case RESPONSE_CODE_SUCCEED://成功 distribute.onResponse(response); break; case RESPONSE_CODE_UNLOGIN: L.e(this, "未登录,重新获取JSESSIONID"); LoginModel model = new LoginModel(context); model.login(UserUtils.getUserInfo(context), new CommonListener() { @Override public void successListener(UserBean user) { start(context); } @Override public void errorListener(int errorCode, String errorMassage) { Toast.makeText(context, "请重新登录登录", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(context, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }); break;
@Override public byte[] getBody() throws AuthFailureError { return json.getBytes(); } @Override public String getBodyContentType() { return "application/json;charset=" + getParamsEncoding(); }