1, 普通的http json请求 请看下面架构草图:

这样就抽象出了其他Activity可能需要的Http Json请求的功能. 只要其他Activity有Http Json请求的需求都可以继承BaseActivity. 这样就统一了该功能的请求模式, 而不必为每个Activity单独做这样的功能. 维护性也强.

2, API详解 :

①public void onPrepare()
在UI线程执行, 该方法主要是用来在任务执行前做的一些操作 : 如显示加载提示; 判断网络连接等.

②public Object shouldExecute(HttpParam params)
在子线程中执行 , 该方法主要是用来判断这个请求有没有必要执行下去. 应用场景: 判断该请求的数据是否在本地或者数据库中, 如果在则不需要请求网络, 执行从本地查询即可, 最后把数据返回出去, 这样也就减少了网络请求.

③public Object handleJsonData(String json) 在子线程中执行, 该方法主要用来处理返回的json数据. 然后把处理后的数据返回.

④public void onFinalResult(Object content) 在主线程中执行, 该方法主要用来, 把数据渲染到前台界面.

⑤public void onFailed(int type, String msg)
在主线程中执行, 该方法用来处理 请求失败的情况.

3 , 回调接口 :

我们需要把共性和特性区别开来, 把共性都统一处理了 . 而特性是可能个别子类Activity有不同的需求(比如有的Activity需要显示加载提示,有的不需要, ).  所以我们把这些功能抽象成接口, 共前台的Activity进行回调 . 如果没有特别的地方,则在前台Activity不重写(overriding)这些接口方法即可 . 这样就保证了功能灵活性.

这些回调方法我统一抽取到了一个接口里:

public interface ISingleCallback {
	public void onError(int taskFlag,int type, String msg);
	public Object searchCache(int taskFlag,HttpParam params);
	public Object parseJson(int taskFlag,String json);
	public void onFinalData(int taskFlag,Object result);
}

把这些接口方法分别放到②API详解即可.

4 , BaseActivity中完整的http json方法代码如下

	<strong><span style="color:#ff0000;">protected void sendRequest(final int taskFlag, HttpParam params,
			final boolean isNeedDialog) {</span></strong>

		if (TaskController.getInstance().exist(taskFlag)) {
			ToastUtil.showShortToast(getApplicationContext(),
					R.string.task_executing);
			return;
		}
		new TaskHttp(taskFlag, new HttpCallback() {
			@Override
			public void onPrepare() {
				if (isNeedDialog) {
					if (loadingDialog == null) {
						loadingDialog = new LoadingDialog(BaseActivity.this);
					}
					showLoadTip();
				}
			}

			@Override
			public Object shouldExecute(HttpParam params) {
				return searchCache(taskFlag, params);
			}

			@Override
			public Object handleJsonData(String json) {
				try {
					return parseJson(taskFlag, json);
				} catch (Exception e) {
					e.printStackTrace();
				}
				return null;
			}

			@Override
			public void onFinalResult(Object content) {
				onFinalData(taskFlag, content);
			}

			@Override
			public void onFailed(int type, String msg) {
				onError(taskFlag, type, msg);
			}
		}).execute(params);
	}

5, 其他请求:

以上的介绍都是请求http, 但是我们还可能有其他请求, 比如单个数据库查询请求. 这时候我们使用上面一套功能就可能不太合适了. 其实有了上面的思想, 这个很好实现, 第一, 内置一个匿名内部类(AsyncTask),  第二, 通过回调(Interface)把数据传回给前台Activity(Front Activity)进行处理. 代码如下:

	protected void sendBackgroudTask(final int taskFlag, final Object params) {
		new AsyncTask<Void, Void, Object>() {

			@Override
			protected Object doInBackground(Void... arg0) {
				return backgroudTask(taskFlag, params);
			}

			protected void onPostExecute(Object result) {
				onDataBack(taskFlag, result);
			}

		}.execute();
	}

Android项目-高考作文项目架构(二)的更多相关文章

  1. Android项目-高考作文项目架构(三)

    上一篇我们讲到了,  Http Json的功能的抽取. 如果我们请求的是一个列表的数据呢? 我们使用那个功能就不是很好. 因为一个列表, 还有很多其他功能(比如每个listView都需要setAdap ...

  2. Android项目-高考作文功能简介(一)

    前言 :  开发安卓也已2年多了近3年了, 在自己刚入行的时候就有自己独立开发一个App的想法. 后来自己做了<<高考作文>>这一App. 后面续续断断的维护者. 也因为功能简 ...

  3. Android项目-高考作文-使用ORMLite抽象公共的Dao层

    1, 定义统一的Dao接口 public interface IDao<T> { public abstract T getSingleById(int id); public abstr ...

  4. Android项目-高考作文-抽象BaseAdapter

    1, 在使用baseAdapter的时候,总是有需要重复的代码如: @Override public int getCount() { return list.size(); } @Override ...

  5. Android项目-高考作文-AsyncTask的不足

    1, AsyncTask的不足. 从android4.0开始, 后台只允许一个AsyncTask执行, 如果当前的AsyncTask没有执行完毕, 那么当前的请求一直处于等待状态. 直到上一个执行完毕 ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  7. (转载)Android项目实战(三十二):圆角对话框Dialog

    Android项目实战(三十二):圆角对话框Dialog   前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...

  8. 【Android Studio安装部署系列】二十七、Android studio修改项目名称和包名

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 实际项目开发中可能碰到项目名称写错了或者需要修改,而且包名可能也想要修改,那么如何操作呢. 本文是在Android Studio3. ...

  9. eclipse再见,android studio 新手入门教程(二)项目的导入

    上一篇博客介绍了AS的一些常用设置方法,当工具调教妥当后,自然就要开始项目的开发啦.从零开始新建一个项目,这个简单,不必多说,这篇博客会分享我从旧平台eclipse导入项目到AS的过程,以及遇到的一些 ...

随机推荐

  1. Centos Git1.7.1升级到Git2.2.1

    安装需求: ># yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc ># ...

  2. django之模板显示静态文件

    由于django的模板渲染机制,图片不能直接引用,否则不会显示. <img src="/static/img/logo.jpg"> 可以看出图片的大小轮廓,但并不显示内 ...

  3. thymeleaf:局部变量 th:with

    当th:with被处理,firstPer变量创建一个局部变量和变量添加到map自上下文,以便它是用于评估和其他上下文中声明的变量从开始,但只有包含< div >标记的范围内. <di ...

  4. 算法导轮之B树的学习

    最近学习了算法导轮里B树相关的知识,在此写一篇博客作为总结. 1.引言 B树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡搜索树.B树类似于红黑树,但它与红黑树最大不同之处在于B树的节点可以拥有 ...

  5. 浅谈 Axios 在 Vue 项目中的使用

    介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 特性 它主要有如下特性: 浏览器端发起XMLHttpRequests请求 Node端发起http ...

  6. Async分析

     1:android在新版本中不允许UI线程访问网络,但是如果需要访问网络又改怎么办呐?这里有很多解决方案,比如新开一个线程,在新线程中进行访问,然后访问数据,返回后可能会更新界面也可能不更新界面,这 ...

  7. 关于mysql安装到最后一步老是停留在starting server,显示无响应

    从昨天晚上到今天安装MySQL花了好长的时间,一直是在后面starting server 这部就显示无响应,查资料了解到是MySQL有残留,有些注册表文件需要手动清理,下面是具体方法. 1.先用卸载软 ...

  8. ACM KMP 格式输入导致TLE

    在写 Oulipo   POJ - 3461 时候遇上的奇怪的问题 在格式输入上不一样,提交的时候返回TLE,两段代码如下: A#include<iostream> #include< ...

  9. PHP 文件

    PHP 文件处理 fopen() 函数用于在 PHP 中打开文件. 打开文件 fopen() 函数用于在 PHP 中打开文件. 此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来 ...

  10. Spring动态切换多数据源解决方案

    Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时 ...