package cn.mutils.app.net; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.AsyncTask; import java.lang.reflect.Type; import java.net.URL; import cn.mutils.app.AppBuildConfig; import cn.mutils.app.queue.QueueItem; import cn.mutils.app.util.AppUtil; import cn.mutils.core.err.NoConnectionException; import cn.mutils.core.log.Logs; import cn.mutils.core.net.NetClient; import cn.mutils.core.net.NetClient.NetClientListener; import cn.mutils.core.reflect.ReflectUtil; /** * Template of request and response for net API at Android application level * * @see NetClient */ @SuppressWarnings({"unchecked", "unused"}) public class NetTask<REQUEST, RESPONSE> extends QueueItem<INetTask<REQUEST, RESPONSE>> implements INetTask<REQUEST, RESPONSE> { protected NetAsyncTask mTask; protected NetClient<REQUEST, RESPONSE> mClient = new NetClient<REQUEST, RESPONSE>(); public NetTask() { mClient.setListener(new NetClientListener<REQUEST, RESPONSE>() { @Override public Class<?> requestRawType() { return NetTask.this.requestRawType(); } @Override public Type requestGenericType() { return NetTask.this.requestGenericType(); } @Override public Class<?> responseRawType() { return NetTask.this.responseRawType(); } @Override public Type responseGenericType() { return NetTask.this.responseGenericType(); } @Override public String requestCookie(URL url) { return NetCookieCache.getCookie(mContext, url); } @Override public void responseCookie(URL url, String cookie) { NetCookieCache.setCookie(mContext, url, cookie); } @Override public void debugging(String event, String message) { NetTask.this.debugging(event, message); } @Override public REQUEST convertToRequest() { return NetTask.this.convertToRequest(); } @Override public Object convertFromResponse(RESPONSE response) { return NetTask.this.convertFromResponse(response); } @Override public Object signPostJson(REQUEST request) throws Exception { return NetTask.this.signPostJson(request); } @Override public void errorCodeVerify(RESPONSE response) throws Exception { super.errorCodeVerify(response); NetTask.this.errorCodeVerify(response); } }); } protected Class<?> requestRawType() { return ReflectUtil.getParamRawType(this.getClass(), 0); } protected Type requestGenericType() { return null; } protected Class<?> responseRawType() { return ReflectUtil.getParamRawType(this.getClass(), 1); } protected Type responseGenericType() { return null; } public void addListener(NetTaskListener<REQUEST, RESPONSE> listener) { super.addListener(listener); } @Override public long getResponseTime() { return mClient.getResponseTime(); } public boolean isSplitArrayParams() { return mClient.isSplitArrayParams(); } public void setSplitArrayParams(boolean splitArrayParams) { if (mStarted || mStopped) { return; } mClient.setSplitArrayParams(splitArrayParams); } public boolean isRestUrl() { return mClient.isRestUrl(); } public void setRestUrl(boolean restUrl) { if (mStarted || mStopped) { return; } mClient.setRestUrl(restUrl); } public boolean isPostParams() { return mClient.isPostParams(); } public void setPostParams(boolean postParams) { if (mStarted || mStopped) { return; } mClient.setPostParams(postParams); } public boolean isPostJson() { return mClient.isPostJson(); } public void setPostJson(boolean postJson) { if (mStarted || mStopped) { return; } mClient.setPostJson(postJson); } public void setPostJsonSigned(boolean postJsonSigned) { if (mStarted || mStopped) { return; } mClient.setPostJsonSigned(postJsonSigned); } public boolean isRequestConvertible() { return mClient.isRequestConvertible(); } public void setRequestConvertible(boolean requestConvertible) { if (mStarted || mStopped) { return; } mClient.setRequestConvertible(requestConvertible); } public boolean isResponseConvertible() { return mClient.isResponseConvertible(); } public void setResponseConvertible(boolean responseConvertible) { if (mStarted || mStopped) { return; } mClient.setResponseConvertible(responseConvertible); } public Object getResponseConverted() { return mClient.getResponseConverted(); } @Override public String getUrl() { return mClient.getUrl(); } @Override public void setUrl(String url) { if (this.mStarted || this.mStopped) { return; } mClient.setUrl(url); } @Override public String getRequestMethod() { return mClient.getRequestMethod(); } @Override public void setRequestMethod(String requestMethod) { if (this.mStarted || this.mStopped) { return; } mClient.setRequestMethod(requestMethod); } @Override public REQUEST getRequest() { return mClient.getRequest(); } @Override public void setRequest(REQUEST request) { if (this.mStarted || this.mStopped) { return; } mClient.setRequest(request); } @Override public RESPONSE getResponse() { return mClient.getResponse(); } @Override public void setResponse(RESPONSE response) { if (this.mStopped) { return; } mClient.setResponse(response); } public void setCookieId(String cookieId) { if (this.mStarted || this.mStopped) { return; } mClient.setCookieCachedId(cookieId); } public void setCookieWithRequest(boolean cookieWithRequest) { if (this.mStarted || this.mStopped) { return; } mClient.setCookieWithRequest(cookieWithRequest); } public void setCookieWithResponse(boolean cookieWithResponse) { if (this.mStarted || this.mStopped) { return; } mClient.setCookieWithResponse(cookieWithResponse); } protected REQUEST convertToRequest() { return null; } protected Object convertFromResponse(RESPONSE response) { return null; } protected void debugging(String event, String message) { if (!AppBuildConfig.DEBUG) { return; } if (NetClient.EVENT_EXCEPTION.equals(event)) { Logs.e(this.getClass().getSimpleName(), NetClient.getLog(event, message).toString()); } else { Logs.i(this.getClass().getSimpleName(), NetClient.getLog(event, message).toString()); } } protected Object signPostJson(REQUEST request) throws Exception { return request; } protected void errorCodeVerify(RESPONSE response) throws Exception { } @Override public boolean start() { boolean result = super.start(); if (result) { this.mTask = new NetAsyncTask(); this.mTask.execute(); } return result; } @Override public boolean stop() { boolean result = super.stop(); if (result) { if (mClient.getResponse() == null) { if (this.mTask != null) { this.mTask.cancel(true); } mClient.abort(); } } mContext = null; mClient.setRequest(null); mClient.setResponse(null); mClient.setResponseConverted(null); mTask = null; return result; } class NetAsyncTask extends AsyncTask<String, Integer, Object> { protected Object doInBackground(String... paramters) { try { ConnectivityManager connMgr = (ConnectivityManager) mContext .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); if (networkInfo == null || !networkInfo.isConnected()) { return new NoConnectionException(); } return mClient.execute(); } catch (Exception e) { if (AppBuildConfig.DEBUG) { debugging(NetClient.EVENT_EXCEPTION, AppUtil.printStackTrace(e)); } return e; } } protected void onPostExecute(Object object) { for (INetTaskListener<REQUEST, RESPONSE> listener : getListeners(INetTaskListener.class)) { if (object instanceof Exception) { listener.onException(NetTask.this, (Exception) object); } else { listener.onComplete(NetTask.this, NetTask.this.getResponse()); } } stop(); } } }