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 ...
随机推荐
- crontab执行脚本中文乱码,手动执行没有问题
crontab执行脚本中文乱码,手动执行没有问题 产生原因: 这是因为Unix/Linux下使用crontab时的运行环境已经不是用户环境了,因此原本用户下的一些环境变量的设置就失效了.例 ...
- SpringMVC中的设计模式
1.<跟我学SpringMVC> P10 2.<跟我学SpringMVC> P32
- Java——列表框:JList
import java.awt.Container; import java.awt.GridLayout; import java.awt.event.WindowAdapter; import j ...
- hdu 1318 Palindromes
Palindromes Time Limit:3000MS Memory Limit:0KB 64bit ...
- OpenGL Tutorial
https://open.gl https://www.processing.org/tutorials/pshader/
- css input checkbox和radio样式美化
参考:https://segmentfault.com/a/1190000004553258 http://www.haorooms.com/post/css_mh_ck_radio 思路都一样的,先 ...
- js无间隙滚动
代码一: ; //设置文字滚动速度 dome2.innerHTML=dome1.innerHTML //复制dome1为dome2 function Marquee(){ ) //当滚动至dome1与 ...
- Quartz.NET总结(二)CronTrigger和Cron表达式
Quartz.NET的任务调度,主要就是依靠CronTrigger和Cron表达式.Cron是已经在UNIX存在了很长一段时间,它有着强大和可靠的调度能力.CronTrigger类也正是是基于Cron ...
- XML模块
XML 例子: # -*- encoding:utf-8 -*- import requests from xml.etree import ElementTree as ET f = request ...
- 柱状堆积图Echarts
Map<String,Object> map = new HashMap<String, Object>(); //图例的千人.双百 HashMap<String, St ...