情形
1、新出一款框架,需要迭代原有功能,提高效率;
2、原有框架不能满足新需求,比如取消请求网络,失败再次请求网络等;
同样,可以将这一套模式运用到图片框架、数据库框架、缓存框架等等。
组织结构如图
原理
实现
INetHandler.class
public interface INetHandler {
void post(String url , Map<String, String> params , INetCallBack netCallBack );
void get(String url ,HashMap<String,String> params ,INetCallBack netCallBack );
}
定义网络请求所有功能,有些上传文件方法可以补充;或者其他功能。
INetCallBack.class
public interface INetCallBack {
void onSuccess(String result);
void onFailure(String exception);
}
回调请求成功、失败接口;
NetCallBack.class
public abstract class NetCallBack<T> implements INetCallBack {
@Override
public void onSuccess(String result) {
Gson gson=new Gson();
T t=getType(this);
T clazz= (T) gson.fromJson(result, t.getClass());
onSuccess(clazz);
}
private T getType(NetCallBack<T> resultNetCallBack) {
Type t = resultNetCallBack.getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
Type[] ts = pt.getActualTypeArguments();
return (T) ts[0];
}
protected abstract void onSuccess(T result);
}
对回调处理事件做一次封装转化;可以不使用这个转化功能,但需要从INetCallBack中再次处理解析方法。上述方法是将一个返回字符串转化成功传入对象类型数据,减少gson转化功能。
NetHelper.class
public class NetHelper {
/**
* 网络处理转化
*/
private static NetHelper netHelper;
private NetHelper(){}
public static NetHelper getNetHelper(){
if(netHelper==null){
synchronized (NetHelper.class){
if(netHelper==null){
netHelper=new NetHelper();
}
}
}
return netHelper;
}
/**
* 获取一个代理对象
*/
private static INetHandler iNetHandler;
public void setHandler(INetHandler iNetHandler){
this.iNetHandler=iNetHandler;
}
public static INetHandler getNetHandler() {
return iNetHandler;
}
}
全局设置当前使用网络框架。只需要INetHandler的子类即可,设置替换成功。
NetXUtils.class
public class NetXUtils implements INetHandler {
@Override
public void post(String url, Map<String, String> params, INetCallBack netCallBack) {
Log.e("INetHandler","post NetXUtils");
}
@Override
public void get(String url, HashMap<String, String> params, INetCallBack netCallBack) {
Log.e("INetHandler","get NetXUtils");
}
}
NetOkHttp.class
public class NetOkHttp implements INetHandler {
@Override
public void post(String url, Map<String, String> params, INetCallBack netCallBack) {
Log.e("INetHandler","post NetOkHttp");
}
@Override
public void get(String url, HashMap<String, String> params, INetCallBack netCallBack) {
Log.e("INetHandler","get NetOkHttp");
}
}
实际处理网络方法。
使用
先选择那个已有框架
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// NetHelper.getNetHelper().setHandler(new NetOkHttp());
// NetHelper.getNetHelper().setHandler(new NetHttpClient());
//NetHelper.getNetHelper().setHandler(new NetVolley());
NetHelper.getNetHelper().setHandler(new NetXUtils());
}
}
具体方法使用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String url="http://www.baidu.com";
Map<String,String> params=new HashMap<>();
NetHelper.getNetHandler().post(url, params, new NetCallBack<StudentBean>() {
@Override
public void onFailure(String exception) {
}
@Override
public void onSuccess(StudentBean result) {
}
});
}
}
Demo下载
[Demo][3]