使用Volley+OkHttp+Gson加速Android网络开发
生活随笔
收集整理的這篇文章主要介紹了
使用Volley+OkHttp+Gson加速Android网络开发
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Android應用開發中,我們不可避免的需要網絡操作,尤其是在與服務器頻繁的交互過程中,更是需要大量的重復編碼:HttpURLConnection,Thread, AsyncTask, ?Service等,十分復雜又容易出錯。在2013年Google I/O大會上推出了網絡通信框架——Volley。它可以極大簡化HTTP通信,加載網絡圖片的操作,并且在小數據量的頻繁網絡交互中性能表現良好。不過,它不適合進行大文件的上傳下載。
基于上述原因,在最近的項目中我學習使用了Volley網絡庫,然而Volley在使用中也存在一些問題:
比如,Volley自帶的JsonRequest只支持JSONObject,而如果想要使用Gson,還需要自己定制Request。
另外,默認情況下,Volley在Froyo使用Apache Http stack作為其傳輸層,而在Gingerbread及之后的版本上使用HttpURLConnection stack作為傳輸層。很自然我們想到,能不能將口碑十分好的OkHttp替換為Volley的傳輸層呢。
最后,很多時候我們需要一些小文件的上傳操作(如用戶頭像),能不能使用Volley完成這個任務呢。
所以,本文描述一種結合使用Volley+OkHttp+Gson進行快速網絡開發的方法,并給出一些網絡接口封裝的例子。
首先,要將OkHttp替換為Volley的傳輸層,需要實現一個OkHttpStack類,然后在實例化Volley的RequestQueue時將之替換即可:
RequestQueue mQueue = Volley.newRequestQueue(this, new OkHttpStack(new OkHttpClient()));
OkHttpStack類的代碼如下(來自GitHub,詳見文后參考資料部分,這里為了方便網絡不佳的讀者貼出來):
/*** The MIT License (MIT)** Copyright (c) 2015 Circle Internet Financial** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated documentation files (the "Software"), to deal* in the Software without restriction, including without limitation the rights* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell* copies of the Software, and to permit persons to whom the Software is* furnished to do so, subject to the following conditions:** The above copyright notice and this permission notice shall be included in* all copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN* THE SOFTWARE.*/import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.toolbox.HttpStack; import com.squareup.okhttp.Call; import com.squareup.okhttp.Headers; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Protocol; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import com.squareup.okhttp.ResponseBody;import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.ProtocolVersion; import org.apache.http.StatusLine; import org.apache.http.entity.BasicHttpEntity; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine;import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit;/*** OkHttp backed {@link com.android.volley.toolbox.HttpStack HttpStack} that does not* use okhttp-urlconnection*/ public class OkHttpStack implements HttpStack {private final OkHttpClient mClient;public OkHttpStack(OkHttpClient client) {this.mClient = client;}@Overridepublic HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)throws IOException, AuthFailureError {OkHttpClient client = mClient.clone();int timeoutMs = request.getTimeoutMs();client.setConnectTimeout(timeoutMs, TimeUnit.MILLISECONDS);client.setReadTimeout(timeoutMs, TimeUnit.MILLISECONDS);client.setWriteTimeout(timeoutMs, TimeUnit.MILLISECONDS);com.squareup.okhttp.Request.Builder okHttpRequestBuilder = new com.squareup.okhttp.Request.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()) {okHttpRequestBuilder.addHeader(name, additionalHeaders.get(name));}setConnectionParametersForRequest(okHttpRequestBuilder, request);com.squareup.okhttp.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 static HttpEntity entityFromOkHttpResponse(Response r) throws IOException {BasicHttpEntity entity = new BasicHttpEntity();ResponseBody body = r.body();entity.setContent(body.byteStream());entity.setContentLength(body.contentLength());entity.setContentEncoding(r.header("Content-Encoding"));if (body.contentType() != null) {entity.setContentType(body.contentType().type());}return entity;}@SuppressWarnings("deprecation")private static void setConnectionParametersForRequest(com.squareup.okhttp.Request.Builder builder, Request<?> request)throws IOException, 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) {builder.post(RequestBody.create(MediaType.parse(request.getPostBodyContentType()), postBody));}break;case Request.Method.GET:builder.get();break;case Request.Method.DELETE:builder.delete();break;case Request.Method.POST:builder.post(createRequestBody(request));break;case Request.Method.PUT:builder.put(createRequestBody(request));break;case Request.Method.HEAD:builder.head();break;case Request.Method.OPTIONS:builder.method("OPTIONS", null);break;case Request.Method.TRACE:builder.method("TRACE", null);break;case Request.Method.PATCH:builder.patch(createRequestBody(request));break;default:throw new IllegalStateException("Unknown method type.");}}private static ProtocolVersion parseProtocol(final Protocol p) {switch (p) {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 static RequestBody createRequestBody(Request r) throws AuthFailureError {final byte[] body = r.getBody();if (body == null) return null;return RequestBody.create(MediaType.parse(r.getBodyContentType()), body);} }
為了方便調用,封裝Response接口如下: import com.android.volley.Response;public interface ResponseListener<T> extends Response.ErrorListener,Response.Listener<T> {}
至此,對Volley+OkHttp+Gson的封裝就完成了。在使用時,我們可以在自定義Application中初始化Queue,再封裝一個專門的NetworkManager類來提供所有的網絡訪問操作,比如,在我最近的項目中是這樣用的:
import android.app.Application; import android.content.Context;import me.zq.youjoin.model.UserInfo; import me.zq.youjoin.network.NetworkManager;public class YouJoinApplication extends Application {public static float sScale;public static int sHeightPix;private static Context context;private static UserInfo currUser;@Overridepublic void onCreate(){super.onCreate();context = getApplicationContext();NetworkManager.initialize(context);sScale = getResources().getDisplayMetrics().density;sHeightPix = getResources().getDisplayMetrics().heightPixels;}public static Context getAppContext(){return context;}public static UserInfo getCurrUser() {return currUser;}public static void setCurrUser(UserInfo currUser) {YouJoinApplication.currUser = currUser;} }
OkHttpStack.java -- from GitHub
Android Networking I: OkHttp, Volley and Gson
Android Volley完全解析(三),定制自己的Request
Android volley 解析(三)之文件上傳篇
Android OkHttp完全解析 是時候來了解OkHttp了
基于上述原因,在最近的項目中我學習使用了Volley網絡庫,然而Volley在使用中也存在一些問題:
比如,Volley自帶的JsonRequest只支持JSONObject,而如果想要使用Gson,還需要自己定制Request。
另外,默認情況下,Volley在Froyo使用Apache Http stack作為其傳輸層,而在Gingerbread及之后的版本上使用HttpURLConnection stack作為傳輸層。很自然我們想到,能不能將口碑十分好的OkHttp替換為Volley的傳輸層呢。
最后,很多時候我們需要一些小文件的上傳操作(如用戶頭像),能不能使用Volley完成這個任務呢。
所以,本文描述一種結合使用Volley+OkHttp+Gson進行快速網絡開發的方法,并給出一些網絡接口封裝的例子。
首先,要將OkHttp替換為Volley的傳輸層,需要實現一個OkHttpStack類,然后在實例化Volley的RequestQueue時將之替換即可:
RequestQueue mQueue = Volley.newRequestQueue(this, new OkHttpStack(new OkHttpClient()));
OkHttpStack類的代碼如下(來自GitHub,詳見文后參考資料部分,這里為了方便網絡不佳的讀者貼出來):
/*** The MIT License (MIT)** Copyright (c) 2015 Circle Internet Financial** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated documentation files (the "Software"), to deal* in the Software without restriction, including without limitation the rights* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell* copies of the Software, and to permit persons to whom the Software is* furnished to do so, subject to the following conditions:** The above copyright notice and this permission notice shall be included in* all copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN* THE SOFTWARE.*/import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.toolbox.HttpStack; import com.squareup.okhttp.Call; import com.squareup.okhttp.Headers; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Protocol; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import com.squareup.okhttp.ResponseBody;import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.ProtocolVersion; import org.apache.http.StatusLine; import org.apache.http.entity.BasicHttpEntity; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine;import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit;/*** OkHttp backed {@link com.android.volley.toolbox.HttpStack HttpStack} that does not* use okhttp-urlconnection*/ public class OkHttpStack implements HttpStack {private final OkHttpClient mClient;public OkHttpStack(OkHttpClient client) {this.mClient = client;}@Overridepublic HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)throws IOException, AuthFailureError {OkHttpClient client = mClient.clone();int timeoutMs = request.getTimeoutMs();client.setConnectTimeout(timeoutMs, TimeUnit.MILLISECONDS);client.setReadTimeout(timeoutMs, TimeUnit.MILLISECONDS);client.setWriteTimeout(timeoutMs, TimeUnit.MILLISECONDS);com.squareup.okhttp.Request.Builder okHttpRequestBuilder = new com.squareup.okhttp.Request.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()) {okHttpRequestBuilder.addHeader(name, additionalHeaders.get(name));}setConnectionParametersForRequest(okHttpRequestBuilder, request);com.squareup.okhttp.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 static HttpEntity entityFromOkHttpResponse(Response r) throws IOException {BasicHttpEntity entity = new BasicHttpEntity();ResponseBody body = r.body();entity.setContent(body.byteStream());entity.setContentLength(body.contentLength());entity.setContentEncoding(r.header("Content-Encoding"));if (body.contentType() != null) {entity.setContentType(body.contentType().type());}return entity;}@SuppressWarnings("deprecation")private static void setConnectionParametersForRequest(com.squareup.okhttp.Request.Builder builder, Request<?> request)throws IOException, 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) {builder.post(RequestBody.create(MediaType.parse(request.getPostBodyContentType()), postBody));}break;case Request.Method.GET:builder.get();break;case Request.Method.DELETE:builder.delete();break;case Request.Method.POST:builder.post(createRequestBody(request));break;case Request.Method.PUT:builder.put(createRequestBody(request));break;case Request.Method.HEAD:builder.head();break;case Request.Method.OPTIONS:builder.method("OPTIONS", null);break;case Request.Method.TRACE:builder.method("TRACE", null);break;case Request.Method.PATCH:builder.patch(createRequestBody(request));break;default:throw new IllegalStateException("Unknown method type.");}}private static ProtocolVersion parseProtocol(final Protocol p) {switch (p) {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 static RequestBody createRequestBody(Request r) throws AuthFailureError {final byte[] body = r.getBody();if (body == null) return null;return RequestBody.create(MediaType.parse(r.getBodyContentType()), body);} }
然后,我們需要實現使用Gson的Request類:
import com.android.volley.AuthFailureError; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.toolbox.HttpHeaderParser; import com.google.gson.Gson;import java.io.UnsupportedEncodingException; import java.lang.reflect.Type; import java.util.Map;import me.zq.youjoin.utils.LogUtils; import me.zq.youjoin.utils.StringUtils;public class PostObjectRequest<T> extends Request<T> {private ResponseListener listener;private Gson gson;private Type clazz;private Map<String, String> params;public PostObjectRequest(String url, Map<String, String> params, Type type,ResponseListener listener){super(Method.POST, url, listener);this.listener = listener;this.clazz = type;this.params = params;this.gson = new Gson();}@Overrideprotected Response<T> parseNetworkResponse(NetworkResponse response){try{T result;String jsonString =new String(response.data, HttpHeaderParser.parseCharset(response.headers));LogUtils.d("hehe", jsonString);result = gson.fromJson(StringUtils.FixJsonString(jsonString), clazz);return Response.success(result,HttpHeaderParser.parseCacheHeaders(response));}catch (UnsupportedEncodingException e) {return Response.error(new ParseError(e));}}@Overrideprotected void deliverResponse(T response){listener.onResponse(response);}@Overrideprotected Map<String, String> getParams() throws AuthFailureError{return params;}}
最后,我們來實現圖片上傳部分。由于我們希望在上傳圖片的時候添加一些參數,例如用戶id等,導致這部分的實現比較復雜。雖然我們可以將這些信息存儲在圖片文件名中實現傳遞,但這總歸是取巧的辦法。比較正規一點的方法還是研究網頁表單提交時的Post請求的格式,然后自己構造一個合法的Post請求。我們可以使用Chorme的開發者工具來抓取Post請求,研究其格式,下圖為我抓取的一個帶圖片和參數的表單Post請求:
從圖中可以看出,我們只需要重寫getBody()方法,逐行仿照Post格式寫入我們自己的圖片和參數,就可實現參數+圖片的上傳。多張圖片的上傳原理相同。另外,圖片要注意在上傳之前進行壓縮處理。另外,為了方便服務器解析多張圖片,將圖片參數設置為uploadedfile[index]格式。代碼如下:
import android.util.Log;import com.android.volley.AuthFailureError; import com.android.volley.DefaultRetryPolicy; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.toolbox.HttpHeaderParser; import com.google.gson.Gson;import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.lang.reflect.Type; import java.util.List; import java.util.Map;import me.zq.youjoin.model.ImageInfo; import me.zq.youjoin.utils.StringUtils;public class PostUploadRequest<T> extends Request<T> {/*** 正確數據的時候回掉用*/private ResponseListener mListener ;/*請求 數據通過參數的形式傳入*/private List<ImageInfo> mListItem ;private static final String BOUNDARY = "--------------520-13-14"; //數據分隔線private static final String MULTIPART_FORM_DATA = "multipart/form-data";//使用表單數據方法提交private static final String TAG = "hehe_upload_request";private static final String PARAM = "uploadedfile";//圖片的參數,<span style="font-family: Arial, Helvetica, sans-serif;">為了上傳多張圖片,在下面的封裝中使用uploadedfile[index]格式作為圖片參數</span>private Map<String, String> params;private Gson gson;private Type clazz;public PostUploadRequest(String url, List<ImageInfo> listItem,Map<String, String> params,Type type, ResponseListener listener) {super(Method.POST, url, listener);this.mListener = listener ;this.params = params;this.gson = new Gson();this.clazz = type;setShouldCache(false);mListItem = listItem ;//設置請求的響應事件,因為文件上傳需要較長的時間,所以在這里加大了,設為5秒setRetryPolicy(new DefaultRetryPolicy(5000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));}/*** 這里開始解析數據* @param response Response from the network* @return*/@Overrideprotected Response<T> parseNetworkResponse(NetworkResponse response) {try {String mString =new String(response.data, HttpHeaderParser.parseCharset(response.headers));Log.v(TAG, "mString = " + mString);T result = gson.fromJson(StringUtils.FixJsonString(mString), clazz);return Response.success(result,HttpHeaderParser.parseCacheHeaders(response));} catch (UnsupportedEncodingException e) {return Response.error(new ParseError(e));}}/*** 回調正確的數據* @param response The parsed response returned by*/@Overrideprotected void deliverResponse(T response) {mListener.onResponse(response);} //重寫getBody()方法,封裝Post包@Overridepublic byte[] getBody() throws AuthFailureError {if (mListItem == null||mListItem.size() == 0){return super.getBody() ;}ByteArrayOutputStream bos = new ByteArrayOutputStream() ;if(!params.isEmpty()) {StringBuilder sbParams = new StringBuilder();for (Map.Entry<String, String> o : params.entrySet()) {Map.Entry entry = (Map.Entry) o;/*第一行*///`"--" + BOUNDARY + "\r\n"`sbParams.append("--" + BOUNDARY);sbParams.append("\r\n");/*第二行*///Content-Disposition: form-data; name="參數的名稱"; + 參數 + "\r\n"sbParams.append("Content-Disposition: form-data;");sbParams.append(" name=\"");sbParams.append((String) entry.getKey());sbParams.append("\"");sbParams.append("\r\n");sbParams.append("\r\n");sbParams.append((String) entry.getValue());sbParams.append("\r\n");}try {bos.write(sbParams.toString().getBytes("utf-8")); // bos.write("\r\n".getBytes("utf-8"));} catch (IOException e) {e.printStackTrace();}}int N = mListItem.size() ;ImageInfo imageInfo ;for (int i = 0; i < N ;i++){imageInfo = mListItem.get(i) ;StringBuilder sb= new StringBuilder() ;/*第一行*///`"--" + BOUNDARY + "\r\n"`sb.append("--"+BOUNDARY);sb.append("\r\n") ;/*第二行*///Content-Disposition: form-data; name="參數的名稱"; filename="上傳的文件名" + "\r\n"sb.append("Content-Disposition: form-data;");sb.append(" name=\"");sb.append(PARAM + "[" + Integer.toString(i) + "]"); //為了上傳多張圖片,使用uploadedfile[index]格式作為圖片參數sb.append("\"") ;sb.append("; filename=\"") ;sb.append(imageInfo.getFileName()) ;sb.append("\"");sb.append("\r\n") ;/*第三行*///Content-Type: 文件的 mime 類型 + "\r\n"sb.append("Content-Type: ");sb.append(imageInfo.getMime()) ;sb.append("\r\n") ;/*第四行*///"\r\n"sb.append("\r\n") ;try {bos.write(sb.toString().getBytes("utf-8"));/*第五行*///文件的二進制數據 + "\r\n"bos.write(imageInfo.getValue());bos.write("\r\n".getBytes("utf-8"));} catch (IOException e) {e.printStackTrace();}}/*結尾行*///`"--" + BOUNDARY + "--" + "\r\n"`String endLine = "--" + BOUNDARY + "--" + "\r\n" ;try {bos.write(endLine.getBytes("utf-8"));} catch (IOException e) {e.printStackTrace();}// Log.v(TAG,"imageInfo =\n"+bos.toString()) ;return bos.toByteArray();}//Content-Type: multipart/form-data; boundary=----------8888888888888@Overridepublic String getBodyContentType() {return MULTIPART_FORM_DATA+"; boundary="+BOUNDARY;}// @Override //注意一旦重寫getBody()方法,則使用此方法添加參數無效。 // protected Map<String, String> getParams() throws AuthFailureError{ // return params; // } }為了方便調用,封裝Response接口如下: import com.android.volley.Response;public interface ResponseListener<T> extends Response.ErrorListener,Response.Listener<T> {}
至此,對Volley+OkHttp+Gson的封裝就完成了。在使用時,我們可以在自定義Application中初始化Queue,再封裝一個專門的NetworkManager類來提供所有的網絡訪問操作,比如,在我最近的項目中是這樣用的:
import android.app.Application; import android.content.Context;import me.zq.youjoin.model.UserInfo; import me.zq.youjoin.network.NetworkManager;public class YouJoinApplication extends Application {public static float sScale;public static int sHeightPix;private static Context context;private static UserInfo currUser;@Overridepublic void onCreate(){super.onCreate();context = getApplicationContext();NetworkManager.initialize(context);sScale = getResources().getDisplayMetrics().density;sHeightPix = getResources().getDisplayMetrics().heightPixels;}public static Context getAppContext(){return context;}public static UserInfo getCurrUser() {return currUser;}public static void setCurrUser(UserInfo currUser) {YouJoinApplication.currUser = currUser;} }
參考資料:
OkHttpStack.java -- from GitHub
Android Networking I: OkHttp, Volley and Gson
Android Volley完全解析(三),定制自己的Request
Android volley 解析(三)之文件上傳篇
Android OkHttp完全解析 是時候來了解OkHttp了
總結
以上是生活随笔為你收集整理的使用Volley+OkHttp+Gson加速Android网络开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BCH码(能纠正多个随机错误的循环码)
- 下一篇: Go语言web开发学习