看过git上volley和asynchttpclient网络框架的源码好长时间了,打算自己弄个网络框架是基于HttpURLConnection+newCachedThreadPool,目前httpclient已经被淘汰了,盛行的是HttpURLConnection,像volley和okhttp都主打HttpURLConnection,所以我弄了这个框架。
框架结构相对来说比较简单:Request、Response、ResponseListener、NewWorkManager、NewWorkRunnable、RequestParams、Erro等主要的类;
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。基于这个优点所以我选择它。Request封装了请求参数和响应体,初始化线程池,完成整个请求过程。
Request主要用来初始化请求的参数和返回体等。首先要在Application里初始化initRequest()创建线程池。防止context内存泄漏采用了WeakReference引用;
public class Request {
private static NetWorkThreadManager newtWorkInstance;
//在application里初始化
public static void initRequest(){
newtWorkInstance = NetWorkThreadManager.getNetWorkThreadPoolInstance();
}
private WeakReference weakReference;
private Activity activity;
private Response<?> response;
private RequestParams requestParams;
private int tag;
public Request(Response<?> response,Activity activity,RequestParams requestParams,int tag){
weakReference = new WeakReference<Activity>(activity);
this.response = response;
this.requestParams = requestParams;
this.tag = tag;
this.activity = activity;
}
public Request(Response response,Fragment fragment,RequestParams requestParams,int tag){
weakReference = new WeakReference<Fragment>(fragment);
this.response = response;
this.requestParams = requestParams;
this.tag = tag;
activity = fragment.getActivity();
}
private int requestType = 0;
public void setRequestType(int requestType){
this.requestType = requestType;
}
public int getRequestType(){
return requestType;
}
public void requestStart(){
if(!Utils.isNetworkAvailable(activity)){
((ResponseListener)weakReference.get()).onError(new Error("当前无网络"),tag);
return;
}
response.getResponseListener().onBefore(tag);
netWorkRunnable = new NetWorkRunnable(this);
newtWorkInstance.cachedThreadPool.execute(netWorkRunnable);
}
private NetWorkRunnable netWorkRunnable;