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)); }}
}
- Volley框架实现Android网络请求笔记
- Android 网络请求框架Volley学习笔记
- Android网络请求框架 Volley
- Android网络请求框架Volley
- Android网络请求框架Volley
- Android Volley网络请求框架
- Android网络请求框架-----Volley
- android学习笔记之通过Volley框架实现数据请求
- Android网络请求框架Volley的使用
- Android Volley 网络请求框架图
- Android主流网络请求框架Volley
- Android网络请求框架:Volley简单使用
- Android 异步网络请求框架-Volley
- Android —— 网络请求框架 Volley
- android网络请求Volley框架的使用
- Android 主流网络请求框架 Volley
- Android网络请求框架Volley【转债】
- Android网络请求框架Volley学习
- jquery ui sortable 拖动时位置错位
- Java后台---从底层了解Session会话、pageContext
- 智力问题--烧绳子
- JQUERY $.post()
- Spring和MyBatis整合
- Volley框架实现Android网络请求笔记
- 从移动平台应用看企业移动互联网转型
- 随机数
- cache的基本概念
- 顺序表应用1:多余元素删除之移位算法(链表实现)
- iOS数据解析
- 使用Phoenix通过sql语句更新操作hbase数据
- 一定能有我们的蓉儿的!
- [通过HttpWebRequest请求https接口]