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

来源:互联网 发布:便宜好用的护肤品知乎 编辑:程序博客网 时间:2024/05/21 21:31

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();

@Overridepublic 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;}@Overridepublic 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);}@Overrideprotected 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);}@Overrideprotected void deliverResponse(T arg0) {    mListener.onResponse(arg0);// 回调T对象}@Overrideprotected 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 paramsprivate 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);}@Overrideprotected void deliverResponse(T arg0) {    // 回调T对象    mListener.onResponse(arg0);}@Overrideprotected Map<String, String> getParams() throws AuthFailureError {    return mParams;}@SuppressWarnings("unchecked")@Overrideprotected 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
原创粉丝点击