Android架构:用消息机制获取网络数据
网络请求,不管是什么协议,是长连接还是短连接,总是一个异步的请求,过程包括:加请求参数->发起请求->接收响应->解析数据->获得业务数据。
最挫的做法是,业务代码包揽所有这些工作。
次挫的做法是,封装一个网络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;
}
}
Android架构:用消息机制获取网络数据的更多相关文章
- android HttpGet 另开线程获取网络数据问题
android跨线程通讯可以使用android.os.Handler-android.os.Message这两类对象完成. public static void getResultForHttpGet ...
- Android利用Get、Post 获取网络数据
首先是Get: 布局非常easy.就一个button,主要看一下MainActivity吧: package com.francis.httpget; import android.app.Activ ...
- Android中获取网络数据时的分页加载
//此实在Fragment中实现的,黄色部分为自动加载,红色部分是需要注意的和手动加载, 蓝色部分是睡眠时间,自我感觉不用写 ,还有就是手动加载时,不知道为什么进去后显示的就是最后一行,求大神 ...
- android—获取网络数据
取网络数据主要靠发交易(或者说请求,接口等),而这些交易由java中的网络通信,HttpURLConnection和HttpClient实现,以下是具体例子. 大家都知道,网络通信,发送请求有两种 ...
- 重温Android中的消息机制
引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ...
- [置顶] 获取网络数据中的数组显示成ListView的简单流程
首先说一下 这是我自己的个人笔记,如果想看看,不用看细节,可以看流程. 定义一个线程池 ExecutorService pool = Executors.newFixedThreadPool(15) ...
- 浅析Android中的消息机制(转)
原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: public class ...
- 浅析Android中的消息机制(转)
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
- 浅析Android中的消息机制-解决:Only the original thread that created a view hierarchy can touch its views.
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
随机推荐
- 安装vim的ycm
环境centos 6.7 vim 7.3 安装vundle Vundle(Vim bundle)是一个Vim的插件管理器.它是把git操作整合进去,用户需要做的只是去GitHub上找到自己想要的插件的 ...
- php实现文件上传下载功能小结
文件的上传与下载是项目中必不可少的模块,也是php最基础的模块之一,大多数php框架中都封装了关于上传和下载的功能,不过对于原生的上传下载还是需要了解一下的.基本思路是通过form表单post方式实现 ...
- JavaWeb学习笔记——第一个JSP文件
必须加上第一句以用来指定编码,否则会出现乱码 <%@ page language="java" import="java.util.*" contentT ...
- Redis学习——ae事件处理源码分析
0. 前言 Redis在封装事件的处理采用了Reactor模式,添加了定时事件的处理.Redis处理事件是单进程单线程的,而经典Reator模式对事件是串行处理的.即如果有一个事件阻塞过久的话会导致整 ...
- Django基础,Day10 - template 模板引擎与路径设置
作为一个Web框架,Django需要一个方便的方式来生成动态的HTML.最常见的方法依赖于模板.模板包含所需的HTML输出的静态部分以及一些特殊的语法描述如何插入动态内容. Django框架后端默认支 ...
- nginx和fpm的进程数配置和502,504错误
502 和 php-fpm.conf 1.php-cgi进程数不够用.php执行时间长,导致没有空闲进程处理新请求. 2.php-cgi进程死掉.php-fpm超时时间短,当前进程执行超时关闭连接. ...
- MFS文件系统
一.MFS文件系统概论 MFS是linux下的开源存储系统,是由波兰人开发的.MFS文件系统能够实现RAID的功能,不但能够节约存储成本,而且不逊于专业的存储系统,能够实现在线扩展.MFS是一种半分布 ...
- PHP中的NULL类型
特殊的NULL值表示一个变量没有值,NULL类型唯一的值就是NULL.我们需要注意的是NULL不表示空格,也不表示零,也不是空字符串,而是一个变量的值为空.NULL不区分大小写,在下列情况下一个变量被 ...
- php/js互传cookie中文乱码的问题
问题发现: 过去好好的,今天突然网页出现了问题. 在猎豹和IE都出现问题,在360浏览器就正常. 经过排错,最终发现: js存储cookie,php读取的时候成了乱码 . 问题分析: 这是因为文字编 ...
- [asp.net core]project.json(1)
摘要 前面介绍了使用vs2015新建asp.net core web的内容,这篇文章学习下project.json文件的内容. project.json 原文:https://docs.microso ...