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