package com.dpt.TNetwork.net.util; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.widget.ImageView; import com.android.volley.*; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.ImageRequest; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.StringRequest; import com.dpt.TNetwork.application.TNetworkApp; import com.dpt.TNetwork.net.AbAnimImageListener; import com.dpt.TNetwork.net.CustomRequest; import com.dpt.TNetwork.net.DefaultRequestFactory; import com.dpt.TNetwork.net.VolleyErrorHelper; import com.dpt.TNetwork.net.listener.INetClientBaseListener; import com.dpt.TNetwork.net.listener.INetClientJsonListener; import com.dpt.TNetwork.net.listener.INetClientStrListener; import com.dpt.TNetwork.util.LogHelper; import org.json.JSONObject; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Map; /** * Created by dupengtao on 2014/6/13. */ public class NetClient { private static final String TAG = NetClient.class.getSimpleName(); private static NetClient mNetClient; private final DefaultRequestFactory mRequestFactory; private NetClient() { mRequestFactory = new DefaultRequestFactory(); } public static synchronized NetClient init() { if (mNetClient == null) { mNetClient = new NetClient(); } return mNetClient; } public void excuteRequest(Request request, String tag) { TNetworkApp.getInstance().getVolleyController().addToRequestQueue(request, tag); } public void excuteRequest(Request request) { TNetworkApp.getInstance().getVolleyController().addToRequestQueue(request); } public void excuteRequest(int method, String url, Map<String, String> headParams, Map<String, String> postParams, boolean isShouldCache, String tag, INetClientStrListener listener) { StringRequest strRequest = mRequestFactory.produceStrRequest(method, url, headParams, postParams, makeStrListener(listener), makeErrorListener(listener)); if (isShouldCache) { setNoCache(strRequest); } excuteRequest(strRequest, tag); } /** * a simple get string request */ public void excuteRequest(String url, INetClientStrListener listener) { StringRequest strRequest = mRequestFactory.produceStrRequest(url, makeStrListener(listener), makeErrorListener(listener)); excuteRequest(strRequest); } /** * a simple get string request with headParams */ public void excuteRequest(String url, Map<String, String> headParams, INetClientStrListener listener) { StringRequest strRequest = mRequestFactory.produceStrRequest(url, headParams, makeStrListener(listener), makeErrorListener(listener)); excuteRequest(strRequest); } /** * a simple post string request */ public void excutePostStrRequset(String url, Map<String, String> headParams, Map<String, String> postParams, INetClientStrListener listener) { StringRequest strRequest = mRequestFactory.producePostStrRequest(url, headParams, postParams, makeStrListener(listener), makeErrorListener(listener)); excuteRequest(strRequest); } // json public void excuteJsonRequest(int method, String url, Map<String, String> headParams, Map<String, String> postParams, boolean isShouldCache, String tag, INetClientJsonListener listener) { JsonObjectRequest jsonObjectRequest = mRequestFactory.produceJsonRequest(method, url, headParams, postParams, makeJsonListener(listener), makeErrorListener(listener)); if (isShouldCache) { setNoCache(jsonObjectRequest); } excuteRequest(jsonObjectRequest, tag); } /** * a simple get json request */ public void excuteJsonRequest(String url, INetClientJsonListener listener) { JsonObjectRequest jsonObjectRequest = mRequestFactory.produceJsonRequest(url, makeJsonListener(listener), makeErrorListener(listener)); excuteRequest(jsonObjectRequest); } /** * a simple get json request with headParams */ public void excuteJsonRequest(String url, Map<String, String> headParams, INetClientJsonListener listener) { JsonObjectRequest jsonObjectRequest = mRequestFactory.produceJsonRequest(url, headParams, makeJsonListener(listener), makeErrorListener(listener)); excuteRequest(jsonObjectRequest); } /** * a simple post json request */ public void excutePostJsonRequset(String url, Map<String, String> headParams, Map<String, String> postParams, INetClientJsonListener listener) { CustomRequest customRequest = mRequestFactory.producePostJsonRequest(url, headParams, postParams, makeJsonListener(listener), makeErrorListener(listener)); excuteRequest(customRequest); } private static Request setNoCache(Request request) { request.setShouldCache(false); return request; } private Response.Listener<String> makeStrListener(final INetClientStrListener strListener) { Response.Listener<String> listener = new Response.Listener<String>() { @Override public void onResponse(String response) { strListener.onSuccess(response, null); strListener.onFinish(); } }; return listener; } private Response.Listener<JSONObject> makeJsonListener(final INetClientJsonListener jsonListener) { Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { jsonListener.onSuccess(jsonObject, null); jsonListener.onFinish(); } }; return listener; } private Response.ErrorListener makeErrorListener(final INetClientBaseListener listener) { Response.ErrorListener errorListener = new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { processError(error, listener); } }; return errorListener; } private void processError(VolleyError error, INetClientBaseListener listener) { String message = ""; try { message = VolleyErrorHelper.getMessage(error); if (VolleyErrorHelper.ERROR_NO_INTERNET == message) { //没有网络的回调 listener.onNotNetwork(); } else { message += "statusCode" + error.networkResponse.statusCode; //请求失败的回调 listener.onFailure(error, message); } LogHelper.e(TAG, message); } catch (Exception e) { e.printStackTrace(); listener.onFailure(error, message); } finally { //请求完成的回调 listener.onFinish(); } } //image public static ImageLoader.ImageContainer loadImage(String url, ImageView imageView, int loadingResId, int errorResId) { return loadImage(url, imageView, loadingResId, errorResId, 0, 0); } public static ImageLoader.ImageContainer loadImage(String url, ImageView imageView, int loadingResId, int errorResId, int maxWidth, int maxHeight) { ImageLoader imageLoader = TNetworkApp.getInstance().getVolleyController().getImageLoader(); return imageLoader.get(url, ImageLoader.getImageListener(imageView, loadingResId, errorResId), maxWidth, maxHeight); } /** * if do not use xml anim , you should use{@link com.android.volley.toolbox.ImageLoader#get(String, com.android.volley.toolbox.ImageLoader.ImageListener)} * eg. * * @param loadingResId if loadingResId is 0 ,ImageView will not loading image * @param animResId anim in xml * @see {@link com.dpt.TNetwork.net.AbAnimImageListener} */ public static void loadImageWithAnim(Context context, String url, ImageView imageView, int loadingResId, int errorResId, final int animResId) { TNetworkApp.getInstance().getVolleyController().getImageLoader().get(url, new AbAnimImageListener(context, imageView, errorResId, loadingResId) { @Override public int getAnimResId() { if (animResId < 1) { return 0; } return animResId; } }); } /** * @param isShouldCache if false will not in cache */ public static ImageRequest loadImage(String url, final ImageView imageView, int loadingResId, final int errorResId, int maxWidth, int maxHeight, boolean isShouldCache, Bitmap.Config decodeConfig, String tag) { ImageRequest imgRequest = getImageRequest(url, imageView, loadingResId, errorResId, maxWidth, maxHeight, isShouldCache, decodeConfig); TNetworkApp.getInstance().getVolleyController().addToRequestQueue(imgRequest, tag); return imgRequest; } private static ImageRequest getImageRequest(final String url, final ImageView imageView, int loadingResId, final int errorResId, int maxWidth, int maxHeight, final boolean isShouldCache, Bitmap.Config decodeConfig) { if (loadingResId > 0) { imageView.setImageResource(loadingResId); } if (maxWidth < 1) { maxWidth = 0; } if (maxHeight < 1) { maxHeight = 0; } final int finalMaxHeight = maxHeight; final int finalMaxWidth = maxWidth; ImageRequest imgRequest = new ImageRequest(url, new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { imageView.setImageBitmap(response); if (!isShouldCache) { TNetworkApp.getInstance().getVolleyController().getLruBitmapCache().putBitmap(getCacheKey(url, finalMaxWidth, finalMaxHeight), response); } } }, maxWidth, maxHeight, decodeConfig, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { imageView.setImageResource(errorResId); } }); if (!isShouldCache) { setNoCache(imgRequest); } return imgRequest; } public static ImageRequest loadImageByRequest(String url, ImageView imageView, boolean isShouldCache, int loadingResId, int errorResId) { return loadImage(url, imageView, loadingResId, errorResId, 0, 0, isShouldCache, Bitmap.Config.RGB_565, null); } public static Bitmap loadImageInCache(String url, int maxWidth, int maxHeight) { Cache.Entry entry = TNetworkApp.getInstance().getVolleyController().getRequestQueue().getCache().get(getCacheKey(url, maxHeight, maxWidth)); if (entry.data.length != 0) { return BitmapFactory.decodeByteArray(entry.data, 0, entry.data.length); } else { return null; } } public static String loadInCache(String url) { Cache.Entry entry = TNetworkApp.getInstance().getVolleyController().getRequestQueue().getCache().get(url); String data = null; if(entry==null){ return data; } try { data = new String(entry.data, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return data; } public static void cacheRemove(String url) { TNetworkApp.getInstance().getVolleyController().getRequestQueue().getCache().remove(url); } public static void cacheClear() { TNetworkApp.getInstance().getVolleyController().getRequestQueue().getCache().clear(); } public static void cancelSingleRequest(String reqTag) { TNetworkApp.getInstance().getVolleyController().getRequestQueue().cancelAll(reqTag); } public static void cancelAllRequests() { TNetworkApp.getInstance().getVolleyController().getRequestQueue().cancelAll(new RequestQueue.RequestFilter() { @Override public boolean apply(Request<?> request) { return true; } }); } /** * count cache size */ public static long getCacheSize(Context context) { File cacheDir = new File(context.getCacheDir(), "volley"); return cacheDir.length(); } private static String getCacheKey(String url, int maxWidth, int maxHeight) { return new StringBuilder(url.length() + 12).append("#W").append(maxWidth) .append("#H").append(maxHeight).append(url).toString(); } }