做一个自己想要的网络请求框架

本文介绍了一种自定义网络请求框架的设计与实现过程。该框架实现了请求与工具类的解耦,避免使用回调函数,内置JSON解析及结果缓存等功能。通过对调用方式的优化,使其更易于理解和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做一个自己想要的网络请求框架

前段时间做的一个项目,想了很多,尝试了很多,想想真是做的很过瘾的一个项目。

其中有一部分是应用了一个自己重新想出来的一个网络请求框架,当然不是一蹴而就的,也是经过的一段时间磨合的,期间项目里面的网络部分重构了两三次,这还是在开发任务很重的情况下进行的,现在想起来风险真是蛮大的,但是想法已经在脑袋里面形成了,只能感觉到之前的东西烂的已经没办法看了,所以就动手改,一发不可收拾啊。

您可能会想了,现在流行的网络框架太多了,什么RxJava,什么retrofit,都牛的很呢,我做的当然不能与他们相提并论,但是适用就好,那些一揽子方案整个打包过来一下子依赖好几个jar包,出了问题再去找原因就麻烦了,上车容易下车难啊。

说一下要达到的目标

  • 请求的调用类与实际的请求工具类分离,不耦合
  • 请求不使用回调函数,不直接引用回调
  • 请求内实现默认的json解析,也可以在外部设置数据解析方式
  • 内置请求结果缓存,缓存请求的结果(可选)
  • 业务剥离,请求处理不与业务耦合,并方便业务逻辑实现

这些需求目前都已经实现,并且加了一些更加对调用者友好的部分,对可重用的部分用接口和泛型进行了重构,调用方式类似RxJava的方式,更加直观和友好,最终的调用类似下面这个样子

//这里的this可以是实现IMessageDispatcher的任意类型,然后把实现代理到默认的MessageDispatcher
//然后通过handle筛选和通知回调
UserProxy.instance().reuqestLogin(username, passwd).setFilterTask(new FilterTask<LoginResponse>() {
                @Override
                public void onExcute(LoginResponse result) {
                 }
}).register(this);

MessageDispatcher 的实现

public class MessageDispatcher implements IMessageDispatcher{

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Iterator<MessageFilter> iterator = messageFilters.iterator();
            while (iterator.hasNext()) {
                MessageFilter filter = iterator.next();
                if(filter.compare(msg)){
                    filter.getFilterTask().onExcute(filter.getResult(msg));
                    iterator.remove();
                }
            }
        }
    };

    List<MessageFilter> messageFilters = new ArrayList<>();

    @Override
    public void register(final MessageFilter messageFilter) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                messageFilters.add(messageFilter);
            }
        });
    }

    @Override
    public void unRegister(final MessageFilter messageFilter) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                messageFilters.remove(messageFilter);
            }
        });
    }

    public void register(AppNotifier appNotifier){
        appNotifier.registerObserver(handler);
    }

    public void unRegister(AppNotifier appNotifier){
        appNotifier.unRegistrObserver(handler);
    }
}

AppNotifier 的部分代码

public class AppNotifier {
private  static List<ObServer> obServers = new ArrayList<>();
 private AppNotifier(){

    }
    static class Instance{
        static AppNotifier instance= new AppNotifier();
    }

    public static AppNotifier instance(){
        return Instance.instance;
    }
    public  void registerObserver(Handler handler){
        synchronized (obServers){
            Iterator<ObServer> it = obServers.iterator();
            while (it.hasNext()) {
                ObServer obServer = it.next();
                Handler hand = obServer.handlerWeakReference.get();
                if (hand == null || hand.equals(handler)) {
                    it.remove();
                }
            }
            obServers.add(new ObServer(handler));
        }
    }

    public  void unRegistrObserver(Handler handler){
        synchronized (obServers){
            Iterator<ObServer> it = obServers.iterator();
            while (it.hasNext()) {
                ObServer obServer = it.next();
                Handler hand = obServer.handlerWeakReference.get();
                if (hand == null || hand.equals(handler)) {
                    it.remove();
                }
            }
        }
    }
     public  void notify(INotifyEntity requestEntity){
         //省略日志处理
         ......
         //省略日志处理
         synchronized (obServers) {
            Iterator<ObServer> it = obServers.iterator();
            while (it.hasNext()){
                ObServer obServer = it.next();
                Handler handler = obServer.handlerWeakReference.get();
                if(handler==null)
                {
                    it.remove();
                }else{
                    Message message = handler.obtainMessage();
                    message.obj = requestEntity;
                    message.what =TypeAppNotify;
                    message.sendToTarget();
                }
            }
        }
    }


    private static class ObServer{
        WeakReference<Handler> handlerWeakReference;

        public ObServer(Handler handler) {
            this.handlerWeakReference = new WeakReference<Handler>(handler);
        }
    }
}

主要的流程就是这样

Created with Raphaël 2.1.0UserInterfaceUserInterfaceProxyProxyDataManagerDataManagerMessageDispatcherMessageDispatcherAppNotifierAppNotifierHttpExecuterHttpExecuterResponseDispatcherResponseDispatcher编码,业务代理类编码,网络请求参数初始化,新建一个消息通知器初始化,把通知器注册到通知中心发起业务请求发起对感兴趣的消息进行订阅发起网络请求执行网络请求网络请求结果转发结果发到通知中心遍历通知器数据发送给订阅对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值