一个切换网络框架使用的小例子

情形

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]