zoukankan      html  css  js  c++  java
  • Android架构:用消息机制获取网络数据

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

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

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

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

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

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

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

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

    request Response msg

    网络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;

    }

    }

  • 相关阅读:
    面向对象设计的原则里氏代换原则
    阅读源码的一些错误观念
    gdb的一个bug Internal error: 【pc 0xxxxxxx】 in read in psymtab, but not in symtab
    STL中mem_fun和mem_fun_ref的用法
    每天写出好代码的5个建议
    /dev/null /dev/zero/
    SQL Server 2008 对 TSQL 语言的增强
    JQuery 应用JQuery.groupTable.js(二)
    jquery 实现iframe 自适应高度
    JQuery 应用JQuery.groupTable.js
  • 原文地址:https://www.cnblogs.com/mosthink/p/5289011.html
Copyright © 2011-2022 走看看