Volley框架实现Android网络请求笔记

Volley学习记录。

添加okhttp-3.2.0.jar, httpcore-4.4.1.jar, okio-1.6.0.jar, gson-2.6.2.jar, volly-1.0.11.jar。项目中使用Picasso加载图片,这里没有写出volley的图片加载
1、在Application类中声明对象及实现请求相关方法:
参考多个学习资料,运用 volley框架实现Android网络请求的学习过程:
public class App extends Application {
private static App sContext;
private RequestQueue mRequestQueue;
private OkHttpClient mClient = new OkHttpClient.Builder().build();

@Override
public void onCreate() {
    super.onCreate();
    sContext = this;
}
public static App getInstance() {
    return sContext;
}
// Volley请求队列
public RequestQueue getVolleyRequestQueue() {
    if (mRequestQueue == null) {
        // synchronized (App.class) {
        // if (mRequestQueue == null) {
        mRequestQueue = Volley.newRequestQueue(this, new OkHttpStack(mClient));
        // }
        // }
    }
    return mRequestQueue;
}
// 添加请求队列
public static void addRequest(@NonNull Request<?> request) {
    getInstance().getVolleyRequestQueue().add(request);
}
public static void addRequest(@NonNull Request<?> request, String tag) {
    request.setTag(tag);
    getInstance().getVolleyRequestQueue().add(request);
}
// 取消请求
public static void cancelAllRequests(@NonNull String tag) {
    if (getInstance().getVolleyRequestQueue() != null) {
        getInstance().getVolleyRequestQueue().cancelAll(tag);
    }}

}
2、使用okhttp3实现网络底层功能
/**
* 添加 http-core.jar 和 okio.jar
*
* @author Devin
*
*/
public class OkHttpStack implements HttpStack {

private final OkHttpClient mOkHttpClient;

public OkHttpStack(OkHttpClient client) {
    this.mOkHttpClient = client;
}

@Override
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
        throws IOException, AuthFailureError {
    int timeoutMs = request.getTimeoutMs();

    OkHttpClient.Builder builder = mOkHttpClient.newBuilder();
    builder.connectTimeout(timeoutMs, TimeUnit.MILLISECONDS).readTimeout(timeoutMs, TimeUnit.MILLISECONDS)
            .writeTimeout(timeoutMs, TimeUnit.MILLISECONDS);
    OkHttpClient client = builder.build();

    Builder okHttpRequestBuilder = new Builder();
    okHttpRequestBuilder.url(request.getUrl());

    Map<String, String> headers = request.getHeaders();
    for (final String name : headers.keySet()) {
        okHttpRequestBuilder.addHeader(name, headers.get(name));
    }
    for (final String name : additionalHeaders.keySet()) {
        // 这里用header方法,如果有重复的name,会覆盖,否则某些请求会被判定为非法
        okHttpRequestBuilder.header(name, additionalHeaders.get(name));
    }

    setConnectionParametersForRequest(okHttpRequestBuilder, request);

    okhttp3.Request okHttpRequest = okHttpRequestBuilder.build();
    Call okHttpCall = client.newCall(okHttpRequest);
    Response okHttpResponse = okHttpCall.execute();

    StatusLine responseStatus = new BasicStatusLine(parseProtocol(okHttpResponse.protocol()), okHttpResponse.code(),
            okHttpResponse.message());
    BasicHttpResponse response = new BasicHttpResponse(responseStatus);
    response.setEntity(entityFromOkHttpResponse(okHttpResponse));

    Headers responseHeaders = okHttpResponse.headers();
    for (int i = 0, len = responseHeaders.size(); i < len; i++) {
        final String name = responseHeaders.name(i), value = responseHeaders.value(i);
        if (name != null) {
            response.addHeader(new BasicHeader(name, value));
        }
    }

    return response;
}

private HttpEntity entityFromOkHttpResponse(Response okHttpResponse) {
    BasicHttpEntity entity = new BasicHttpEntity();
    ResponseBody body = okHttpResponse.body();

    entity.setContent(body.byteStream());
    entity.setContentLength(body.contentLength());
    entity.setContentEncoding(okHttpResponse.header("Content-Encoding"));

    if (body.contentType() != null) {
        entity.setContentType(body.contentType().type());
    }
    return entity;
}

private ProtocolVersion parseProtocol(Protocol protocol) {
    switch (protocol) {
    case HTTP_1_0:
        return new ProtocolVersion("HTTP", 1, 0);
    case HTTP_1_1:
        return new ProtocolVersion("HTTP", 1, 1);
    case SPDY_3:
        return new ProtocolVersion("SPDY", 3, 1);
    case HTTP_2:
        return new ProtocolVersion("HTTP", 2, 0);
    }

    throw new IllegalAccessError("Unkwown protocol");
}

private void setConnectionParametersForRequest(Builder okHttpRequestBuilder, Request<?> request)
        throws AuthFailureError {
    switch (request.getMethod()) {
    case Request.Method.DEPRECATED_GET_OR_POST:
        // Ensure backwards compatibility. Volley assumes a request with
        // a null body is a GET.
        byte[] postBody = request.getPostBody();
        if (postBody != null) {
            okHttpRequestBuilder
                    .post(RequestBody.create(MediaType.parse(request.getPostBodyContentType()), postBody));
        }
        break;
    case Request.Method.GET:
        okHttpRequestBuilder.get();
        break;
    case Request.Method.DELETE:
        okHttpRequestBuilder.delete();
        break;
    case Request.Method.POST:
        okHttpRequestBuilder.post(createRequestBody(request));
        break;
    case Request.Method.PUT:
        okHttpRequestBuilder.put(createRequestBody(request));
        break;
    case Request.Method.HEAD:
        okHttpRequestBuilder.head();
        break;
    case Request.Method.OPTIONS:
        okHttpRequestBuilder.method("OPTIONS", null);
        break;
    case Request.Method.TRACE:
        okHttpRequestBuilder.method("TRACE", null);
        break;
    case Request.Method.PATCH:
        okHttpRequestBuilder.patch(createRequestBody(request));
        break;
    default:
        throw new IllegalStateException("Unknown method type.");
    }
}

private RequestBody createRequestBody(Request<?> request) throws AuthFailureError {
    byte[] body = request.getBody();
    if (body == null) {
        // OkHttp内部默认的的判断逻辑是POST 不能为空,这里做了规避
        if (request.getMethod() == Request.Method.POST) {
            body = "".getBytes();
        } else {
            return null;
        }
    }

    return RequestBody.create(MediaType.parse(request.getBodyContentType()), body);
}

}

3、最后在Activity中进入测试
public class MainActivity extends Activity {

String url;
String post_url;
ProgressDialog pDialog;
String tag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pDialog = new ProgressDialog(this);
pDialog.setMessage(“Loading…”);

    // getJsonArrayRequest();
    // getStringRequest();
     getGsonRequest();
    // getJsonObject();
    // postObjectRequest();
}

private void postObjectRequest() {
    pDialog.show();
    JsonObjectRequest request = new JsonObjectRequest(Method.POST, post_url, null, new Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject arg0) {
            Log.e("1", "response ---" + arg0.toString());
            pDialog.hide();

        }
    }, new ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError arg0) {
            Log.e("1", "error --------" + arg0.getMessage());
            pDialog.hide();
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> map = new HashMap<String, String>();
            map.put("userID", "");
            map.put("microCourseID", "1667DF4F50984DA6BCA8DC38BDD91FAF");
            map.put("lectureID", "A279281063BD41C8BD80B21A34BF02F4");
            map.put("noteType", "0");
            map.put("pageIndex", "1");
            map.put("pageSize", "1");
            map.put("isShared", "1");
            map.put("toKen", "709C192D-947A-43EA-83BE-8FA36BB4A263");
            return map;
        }
    };
    tag = "JsonObjectRequest";
    App.addRequest(request, tag);
}

private void getJsonObject() {

    pDialog.show();
    JsonObjectRequest request = new JsonObjectRequest(url, null, new Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject arg0) {
            Log.e("1", "response ---" + arg0.toString());
            pDialog.hide();

        }
    }, new ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError arg0) {
            Log.e("1", "error --------" + arg0.getMessage());
            pDialog.hide();
        }
    });
    tag = "JsonObjectRequest";
    App.addRequest(request, tag);
}

private void getGsonRequest() {

    pDialog.show();

    GsonRequest<Note> request = new GsonRequest<Note>(url, Note.class, new Listener<Note>() {
        @Override
        public void onResponse(Note arg0) {
            Log.e("1", "response ---" + arg0.toString());
            pDialog.hide();
        }
    }, new ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError arg0) {
            Log.e("1", "error --------" + arg0.getMessage());
            pDialog.hide();
        }
    });
    tag = "GsonRequest";
    App.addRequest(request, tag);
}

private void getStringRequest() {
    pDialog.show();
    StringRequest request = new StringRequest(Method.GET, url, new Listener<String>() {
        @Override
        public void onResponse(String arg0) {
            Log.e("1", "response ---" + arg0.toString());
            pDialog.hide();
        }
    }, new ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError arg0) {
            Log.e("1", "error --------" + arg0.getMessage());
            pDialog.hide();
        }
    });
    tag = "StringRequest";
    App.addRequest(request, tag);
}

private void getJsonArrayRequest() {
    pDialog.show();
    JsonArrayRequest request = new JsonArrayRequest(url, new Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            Log.e("1", "response ---" + response.toString());
            pDialog.hide();
        }
    }, new ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("1", "error --------" + error.getMessage());
            pDialog.hide();
        }
    });
    tag = "JsonArrayRequest";
    App.addRequest(request, tag);
}
@Override
protected void onDestroy() {
    super.onDestroy();
    App.cancelAllRequests(tag);
}

}

4、自定义GsonRequest请求
public class GsonRequest extends Request {
private final Listener mListener;
private Gson mGson;
private Class mClass;

public GsonRequest(int method, String url, Class<T> clazz, Listener<T> listener, ErrorListener errorListener) {
    super(method, url, errorListener);
    mGson = new Gson();
    mClass = clazz;
    mListener = listener;
}

public GsonRequest(String url, Class<T> clazz, Listener<T> listener, ErrorListener errorListener) {
    this(Method.GET, url, clazz, listener, errorListener);
}

@Override
protected void deliverResponse(T arg0) {
    mListener.onResponse(arg0);// 回调T对象
}

@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {

    try {
        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        // 用Gson解析返回Java对象
        return Response.success(mGson.fromJson(jsonString, mClass), HttpHeaderParser.parseCacheHeaders(response));
    } catch (Exception e) {
        return Response.error(new ParseError(e));
    }
}

}

可用于post方式
public class GsonPostRequest extends Request {

private final Listener<T> mListener;
private Gson mGson;
private Class<T> mClass;
private Map<String, String> mParams;// post params
private TypeToken<T> mTypeToken;

public GsonPostRequest(int method, Map<String, String> params, String url, Class<T> clazz, Listener<T> listener,
        ErrorListener errorListener) {
    super(method, url, errorListener);

    mGson = new Gson();
    mParams = params;
    mClass = clazz;
    mListener = listener;
}

public GsonPostRequest(int method, Map<String, String> params, String url, TypeToken<T> typeToken,
        Listener<T> listener, ErrorListener errorListener) {
    super(method, url, errorListener);

    mGson = new Gson();
    mParams = params;
    mTypeToken = typeToken;
    mListener = listener;
}

public GsonPostRequest(String url, Class<T> clazz, Listener<T> listener, ErrorListener errorListener) {
    this(Method.GET, null, url, clazz, listener, errorListener);
}

public GsonPostRequest(String url, TypeToken<T> typeToken, Listener<T> listener, ErrorListener errorListener) {
    this(Method.GET, null, url, typeToken, listener, errorListener);
}

@Override
protected void deliverResponse(T arg0) {
    // 回调T对象
    mListener.onResponse(arg0);
}

@Override
protected Map<String, String> getParams() throws AuthFailureError {
    return mParams;
}

@SuppressWarnings("unchecked")
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {

    try {
        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        if (mTypeToken == null) {
            return Response.success(mGson.fromJson(jsonString, mClass), HttpHeaderParser.parseCacheHeaders(response));
        }else {
            return (Response<T>) Response.success(mGson.fromJson(jsonString, mTypeToken.getType()),
                    HttpHeaderParser.parseCacheHeaders(response));
        }
        // 用Gson解析返回Java对象
    } catch (Exception e) {
        return Response.error(new ParseError(e));
    }
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值