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. Python从入门到实践 学习笔记(二)元祖686gffs

    列表是可以修改的,而不可变的列表被称为元组 . 定义 * 用圆括号来标识.定义元组后,使用索引来访问其元素,就像访问列表元素一样 修改变量 * 不能修改元组的元素,但可以给存储元组的变量赋值 修改元素 ...

  2. idea Library XXXXXXXX has broken classes paths

    点fix 然后全部 全部按- 删掉 一开始以为会影响很大 后来发现他地址错了都导不进 要是真要用到的时候也没用 还是要maven单独导进来

  3. angularjs+ionic的app端分页和条件

    做app项目积分商城的商品列表需要分页显示 实现: ionic滚动条:ion-scroll 用于创建一个可滚动的容器. 附:菜鸟教程:http://www.runoob.com/ionic/ionic ...

  4. 整理spring定时器corn表达式

    1.结构 corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份 2.各字段的含义   字段 允许值 允许的特殊字符 秒 0~59 - * / 分 0~59 - * / ...

  5. 59. Spiral Matrix II(中等,同54题)

    Given an integer \(n\), generate a square matrix filled with elements from 1 to \(n^2\) in spiral or ...

  6. OpenSuSE Linux下安装Oracle10g的步骤

    OpenSuSE Linux下安装Oracle10g的步骤: --root用户 --1.vi etc/profile 添加脚本: if [ \$USER = "oracle" ]; ...

  7. 深度解读GoogleNet之Inception V1

    GoogleNet设计的目的 GoogleNet设计的初衷是为了提高在网络里面的计算资源的利用率. Motivation 网络越大,意味着网络的参数较多,尤其当数据集很小的时候,网络更容易发生过拟合. ...

  8. proc文件系统探索 之 以数字命名的目录

    在proc根目录下,以数字命名的目录表示当前一个运行的进程,目录名即为进程的pid.其内的目录和文件给出了一些关于该进程的信息. niutao@niutao-desktop:/proc/6584$ l ...

  9. linux TCP头部的构造的简单分析

    TCP的头部的构造是在函数tcp_transmit_skb()中进行的 函数片段如下: /* Build TCP header and checksum it. */ th = tcp_hdr(skb ...

  10. solr界面

    1.1 界面功能介绍 1.1.1 Analysis