package com.dpt.tbase.app.net;
import java.io.File;
import org.json.JSONObject;
import android.content.Context;
import android.text.TextUtils;
import android.widget.ImageView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.dpt.tbase.app.application.TBaseApplication;
import com.dpt.tbase.app.base.exception.NetNotConnException;
import com.dpt.tbase.app.base.utils.LogHelper;
import com.dpt.tbase.app.base.utils.NetWorkUtil;
import com.dpt.tbase.app.net.interfaces.INetBaseClientCallBack;
import com.dpt.tbase.app.net.interfaces.INetJsonClientCallBack;
import com.dpt.tbase.app.net.interfaces.INetStrClientCallBack;
/**
* 运用了抽象工厂设计模式
*
* @author dupengtao@cyou-inc.com
*
* 2014-5-29
*/
@SuppressWarnings("rawtypes")
public class TBaseNetClent2 {
public final static int TYPE_JSON = 1;
public final static int TYPE_STRING = 2;
private static TBaseNetClent2 netClent2;
private static RequestFractory mRequestFractory;
private static final String TAG = TBaseNetClent2.class.getSimpleName();
private TBaseNetClent2(RequestFractory requestFractory) {
mRequestFractory = requestFractory;
}
/**
* if requestFractory is null use {@link TBaseRequestFractory}
*
*/
public static synchronized TBaseNetClent2 getInstance(RequestFractory requestFractory){
if(netClent2==null){
if(requestFractory==null){
requestFractory= new TBaseRequestFractory();
}
netClent2 = new TBaseNetClent2(requestFractory);
}
return netClent2;
}
public static void setRequestFractory(RequestFractory requestFractory) {
mRequestFractory = requestFractory;
}
public static RequestFractory getRequestFractory() {
return mRequestFractory;
}
/**
* custom request
*/
public void executeRequest(Request request) throws NetNotConnException,NullPointerException{
executeRequest(true, null, request);
}
public void executeRequest(boolean isShouldCache, String resTag ,Request<?> request) {
addQueue(isShouldCache, resTag, request);
}
public void executeRequest(Context context,int method, String url, int type, INetBaseClientCallBack callBack) throws NetNotConnException,NullPointerException{
executeRequest(context,method,url,type, true, null, callBack);
}
/**
* @param method @see {@link Request.Method}
* @param type @see {@link TBaseNetClent2#TYPE_JSON} {@link TBaseNetClent2#TYPE_STRING}
* @param isShouldCache true add cache
* @param resTag add request by tag
* @param callBack {@link INetBaseClientCallBack}
*/
public void executeRequest(Context context,int method,String url, int type, boolean isShouldCache, String resTag, INetBaseClientCallBack callBack)
throws NetNotConnException,NullPointerException{
LogHelper.e(TAG, url);
check(context, url, callBack);
Request request ;
if (TYPE_STRING == type) {
INetStrClientCallBack strClientCallBack = (INetStrClientCallBack) callBack;
request = getStringRequest(context,method, url, strClientCallBack);
} else{
INetJsonClientCallBack jsonClientCallBack = (INetJsonClientCallBack) callBack;
request = getJsonRequest(context,method, url, jsonClientCallBack);
}
addQueue(isShouldCache, resTag, request);
}
public static void executeImageRequest(String requestUrl, ImageView imageView, int roadingResId,int errorResId) {
LogHelper.e(TAG, requestUrl);
TBaseApplication.getInstance().getImageLoader().get(requestUrl, ImageLoader.getImageListener(imageView, roadingResId, errorResId));
}
public static void cacheRemove(String url){
TBaseApplication.getInstance().getRequestQueue().getCache().remove(url);
}
public static void cacheClear(){
TBaseApplication.getInstance().getRequestQueue().getCache().clear();
}
public static void cancelSingleRequest(String reqTag){
TBaseApplication.getInstance().getRequestQueue().cancelAll(reqTag);
}
public static void cancelAllRequests(){
TBaseApplication.getInstance().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 void addQueue(boolean isShouldCache, String resTag, Request<?> request) {
if (!isShouldCache) {
request.setShouldCache(false);
}
if (TextUtils.isEmpty(resTag)) {
TBaseApplication.getInstance().addToRequestQueue(request);
} else {
TBaseApplication.getInstance().addToRequestQueue(request, resTag);
}
}
private void check(Context context, String url, INetBaseClientCallBack callBack) {
if (!NetWorkUtil.checkNetWork(context)) {
LogHelper.e(TAG, "unable to connect to the network !");
callBack.onFinishCallBack();
throw new NetNotConnException("net not connected");
}
if (TextUtils.isEmpty(url)) {
LogHelper.e(TAG, "url is null or empty !");
throw new NullPointerException("url is null or empty !");
}
if (callBack == null) {
LogHelper.e(TAG, "callback not find !");
throw new NullPointerException("callback not find !");
}
}
private Request getJsonRequest( final Context context,int method, String url,
final INetJsonClientCallBack callBack) {
callBack.onStartCallBack();
Listener<JSONObject> listener = new Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
callBack.onSuccessCallBack(response);
callBack.onFinishCallBack();
}
};
ErrorListener errorListener = getErrorListener(context, callBack);
return mRequestFractory.produceJsonRequest(method, url, listener, errorListener);
}
private Request getStringRequest(final Context context,int method,
String url, final INetStrClientCallBack callBack) {
callBack.onStartCallBack();
Listener<String> listener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
callBack.onSuccessCallBack(200, response.toString(), null);
callBack.onFinishCallBack();
}
};
ErrorListener errorListener = getErrorListener(context, callBack);
return mRequestFractory.produceStringRequest(method, url, listener, errorListener);
}
private ErrorListener getErrorListener(final Context context, final INetBaseClientCallBack callBack) {
ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
processError(context, callBack, error);
}
};
return errorListener;
}
private void processError(final Context context,
final INetBaseClientCallBack callBack, VolleyError error) {
String message = "";
try {
message = VolleyErrorHelper.getMessage(error, context);
message += "statusCode" + error.networkResponse.statusCode;
LogHelper.e(TAG, message);
} catch (Exception e) {
e.printStackTrace();
} finally {
callBack.onFailureCallBack(error, message);
callBack.onFinishCallBack();
}
}
}