网络请求,不管是什么协议,是长连接还是短连接,总是一个异步的请求,过程包括:加请求参数->发起请求->接收响应->解析数据->获得业务数据。

最挫的做法是,业务代码包揽所有这些工作。

次挫的做法是,封装一个网络Utils类,业务代码传一个回调对象给这个类来获取网络请求数据。这个是普遍做法,缺点是一层层的回调会把代码搞乱。

较佳的做法是,用发消息来完成网络请求的过程。仍然是有一个封装好的网络Utils类,然后整个过程是:

1, 业务类发网络请求消息;

2, 网络Utils类接收网络请求消息;

3, 网络Utils类收到服务器响应后发送响应消息出去;

4, 业务类接收自己感兴趣的响应消息获取数据。

网络Utils类接收所有的请求消息,所以它监听的是一个基类消息对象:RequestMessage。业务类发送的消息都继承自这个RequestMessage。RequestMessage中定义了本次请求的url和请求参数等信息。

业务类只接收自己需要的类型的响应消息,而不是全部,所以,网络Utils类发回去的响应消息必须是具体的子类。当网络Utils类收到RequestMessage之后,就发起网络请求,获取响应数据后,再生成一个与具体的RequestMessage对应的ResponseMessage的子类,然后发回去,只有监听了这个具体的ResponseMessage的业务类能接收到。

还有一个问题,网络Utils类如何把一个RequestMessage转换成一个与之对应的ResponseMessage呢?

用泛型。Response类作为Request类的一个泛型参数,然后Request的接口定义一个创建其对应的Response的方法。类似如下声明:

class RequestMessage<T extends RequestResponse>

{

public T createResponse() {

return 具体的response;

}

}

最新文章

  1. Java中的关键字 transient
  2. 服务器后台TCP连接存活问题
  3. MongoDB的学习和使用(MongoDB GridFS)
  4. GZIP压缩
  5. 2016-1-7第一个完整APP 私人通讯录的实现 6:在联系人界面增加删除联系人的功能
  6. MYSQL数据库性能调优之一:调优技术基础
  7. 走过而立之年的Coder
  8. Android WebView和JavaScript交互
  9. jQuery 随滚动条滚动效果 (适用于内容页长文章)
  10. [LeetCode] Degree of an Array 数组的度
  11. boost--文件、目录操作
  12. Android SurfaceView及TextureView对比
  13. PHP7通过yum源安装及性能测试
  14. redis 的 docker 镜像使用
  15. [转]关于ImportError: xxxx.so: undefined symbol: PyFPE_jbuf的解决方案
  16. delphi正则表达式学习笔记(二)
  17. SMACH专题(四)----状态State类的实现和中文注释
  18. Android解析WindowManagerService(一)WMS的诞生
  19. lintcode-65-两个排序数组的中位数
  20. Android 框架学习3:从 EventBus 中学到的精华

热门文章

  1. win7下exe提示无法正常启动(0xc0000906)
  2. JAVA第三周课后作业
  3. Android学习笔记——menu
  4. OBJ Loader Source Code
  5. ecshop 变量表
  6. C语言二维数组中的指针问题
  7. [Ljava.lang.String和java.lang.String区别
  8. [Angularjs]表单验证
  9. php各种编码集详解和以及在什么情况下进行使用
  10. 采用ETL with RDBMS模式来实现ETL