转载请注明本文出自JFlex的博客http://blog.csdn.net/jflex/article/details/46456621,请尊重他人的辛勤劳动成果,谢谢!

Android快速开发之appBase——(5).BasePresenter的使用

Presenter是来自MVP中的概念,是用来处理与用户交互的逻辑。在这里更加简单化,Presenter中的方法是根据业务来定义,比如获取消息列表,那么业务常常会这样:先去请求网络,网络正常请求到数据返回并展示在UI层,网络错误没有拿到数据,看看缓存中有没有,然后从缓存中拿到数据并返回并展示在UI层;突然,有一天业务需求发生变化,只允许获取网络,网络错误UI上显示没有消息。如果之前在UI层已经做过数据为空的处理,那么UI层就不用修改任何代码,仅仅只需要修改presenter层,这样就将UI层和业务层区分,并且耦合降低了。

1、概述

BasePresenter仅仅是提取的一个概念,实现的方式有很多种,在这里我采用callback机制,presenter和callback中的方法是对应存在的,比如presenter中getProductsByType(int type),那么这个方法主题中通过异步处理数据,处理完成之后将数据通过callback回传给setProductsByType(Object result)。

类或接口 presenter callback
方法 getProductsByType(int type) setProductsByType(Object result)
执行所在线程 非UI线程 UI线程

2、代码

package com.snicesoft.presenter;import android.content.Context;import com.snicesoft.util.NetworkUtil;public class BasePresenter<C extends BasePresenter.Callback> {public interface Callback {}private Context context;protected C callback;public void setCallback(C callback) {this.callback = callback;}public BasePresenter(Context context) {this.context = context;}public boolean isNetConnect() {return NetworkUtil.isConnect(getContext());}public Context getContext() {return context;}
}
  • 代码采用内部接口定义,为了减少代码整体风格不那么臃肿。当然,也可以按照自己的编码风格自定义。
  • 字段说明:context只是为了方便操作一些常用的业务,比如上面提到的网络连接判断。字段都可以按照自己的需求添加,比如这个presenter中需要网络请求,那么可以添加HttpReq模块;再比如需要APICloud云API请求,可以添加APICloudSDK模块。

3、使用范围

常用范围
  • activity:实现callback接口,定义callback所在presenter的对象字段,在onCreate中初始化。
  • fragment:实现callback接口,定义callback所在presenter的对象字段,在onCreate中初始化。

原则上,哪里需要就写哪里。

4、示例

WgouPresenter.java

package com.haier.rrmaker.ui.home.fragment.presenter;import android.app.ProgressDialog;
import android.content.Context;import com.alibaba.fastjson.JSON;
import com.haier.rrmaker.R;
import com.haier.rrmaker.http.HttpParams;
import com.haier.rrmaker.http.HttpResult;
import com.haier.rrmaker.http.response.IndexResponse;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.snicesoft.http.HttpReq;
import com.snicesoft.presenter.BasePresenter;
import com.snicesoft.util.CommonUtils;
import com.snicesoft.util.DialogUtil;public class WgouPresenter extends BasePresenter<WgouPresenter.Callback> {public interface Callback extends BasePresenter.Callback {void index(IndexResponse response);}HttpReq httpReq;public void setHttpReq(HttpReq httpReq) {this.httpReq = httpReq;}ProgressDialog progressDialog;public WgouPresenter(Context context) {super(context);progressDialog = DialogUtil.getProgressDialog(context);}protected void showDialog(CharSequence message, boolean... flag) {if (flag != null) {if (flag.length > 0)progressDialog.setCancelable(flag[0]);if (flag.length > 1)progressDialog.setCanceledOnTouchOutside(flag[1]);}progressDialog.setMessage(message);progressDialog.show();}protected void closeDialog() {if (progressDialog.isShowing())progressDialog.dismiss();}public void index() {if (httpReq == null)return;if (isNetConnect()) {showDialog("正在加载");httpReq.POST(HttpParams.Wgou.Index, null,new RequestCallBack<String>() {@Overridepublic void onFailure(HttpException arg0, String arg1) {closeDialog();CommonUtils.showToast(getContext(),R.string.net_error_retry);}@Overridepublic void onSuccess(ResponseInfo<String> arg0) {closeDialog();IndexResponse response = JSON.parseObject(arg0.result, IndexResponse.class);if (HttpResult.isSuccess(response)) {callback.index(response);} else {CommonUtils.showToast(getContext(), "数据返回错误");}}});} else {CommonUtils.showToast(getContext(), R.string.net_error);}}}

WgouFragment.java

public class WgouFragment extendsAvFragment<WgouHolder, WgouData, HomeActivity> implementsWgouPresenter.Callback {WgouPresenter wgouService;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);wgouService = new WgouPresenter(fa());wgouService.setHttpReq(fa().getApp().httpReq());wgouService.setCallback(this);}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);wgouService.index();}@Overridepublic void index(IndexResponse response) {_holder.index(response);_holder.scrollBottom();}
}

这里简单举例在Fragment中的使用:
1、首先定义Presenter和Callback

类或接口 WgouPresenter WgouPresenter.Callback 说明
方法 index() index(IndexResponse response) 获取首页信息
执行所在线程 非UI线程 UI线程

2、WgouFragment实现WgouPresenter.Callback
实现index(IndexResponse response)方法,将返回的数据再此方法绑定到对应的UI上。如果业务在开发之前充分沟通,这块完全可以模拟数据进行测试,后期在线上测试环境调试。
对于WgouPresenter的定义在onCreate初始化。onActivityCreated方法中进行index()请求,这只是做个演示。但是请求顺序一定不能错误:必须在WgouPresenter初始化完毕并且View初始化完毕(也就是Holder初始化完毕)

5、最后

一定要注意规范,否则会导致代码混乱。对于这套规范我写了个简单的代码生成器,生成activity和fragment的时候会将holder、data、presenter全部生成好,省去了自己创建的麻烦。
由于编译环境不同,故不提供jar包,直接上源码。

下载地址

Android快速开发之appBase——(5).BasePresenter的使用相关推荐

  1. Android快速开发之appBase——(4).详解com.snicesoft.Application和BaseActivity

    转载请注明本文出自JFlex的博客http://blog.csdn.net/jflex/article/details/46441571,请尊重他人的辛勤劳动成果,谢谢! Android快速开发之ap ...

  2. Android快速开发之appBase——(6).HttpReq和APICloudSDK

    转载请注明本文出自JFlex的博客http://blog.csdn.net/jflex/article/details/46462077,请尊重他人的辛勤劳动成果,谢谢! Android快速开发之ap ...

  3. android idata 模式,Android快速开发之appBase——(3).详解IHolder和IData

    Android快速开发之appBase--(3).详解IHolder和IData IHolder和IData是AVLib的两个组件,在前面已经使用过了,那么这一篇将会详细说明这两个组件的用法. IHo ...

  4. Android NDK开发之 NEON基础介绍

    原文:http://blog.csdn.net/app_12062011/article/details/50434259 Android NDK开发之 NEON基础介绍 这是官方介绍: http:/ ...

  5. 【转载】Android逆向开发之smali语言的学习

    Android逆向开发之smali语言的学习 该文转载自乱码三千 – 分享实用IT技术 smali和java基本数据类型对比 smali java B byte S short I int J lon ...

  6. android程序移动到Linux,Android应用开发之Android 系统 -- 使用Xshell在Windows系统和Linux系统之间进行文件传输...

    本文将带你了解Android应用开发之Android 系统 -- 使用Xshell在Windows系统和Linux系统之间进行文件传输,希望本文对大家学Android有所帮助. 使用Xshell在Wi ...

  7. Java服务器接口快速开发之Servlet详细教程

    今日科技快讯 7月14日晚间消息,据乐视网刚刚披露的业绩预告,公司预计2017年上半年亏损6.37亿至6.42亿元,上年同期盈利2.84亿元.报告期内,乐视网资产减值损失计提规模较大约为2.3亿元,其 ...

  8. 镜像处理坐标 android,Android应用开发之Android重写ImageView实现图片镜像效果的代码教程...

    本文将带你了解Android应用开发之Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助. 前两天朋友问我一个问题,如何实现从手机系统相册加载一张图 ...

  9. Android NDK开发之旅31 FFmpeg音频解码

    ###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...

最新文章

  1. 世界人工智能大赛来了!
  2. Python高级网络编程系列之第二篇
  3. 十年SNS社区产品:近乎 V5.0-V5.2安装及问题解决思路
  4. 怎样设定手机或平板让它更安全?
  5. python树状节点 可拖拽_Python 的 heapq 模块源码分析
  6. hbase单机模式配置
  7. 有人说赚钱靠项目,也有人说赚钱靠技术
  8. Java关键字transient和volatile小结(转)
  9. java将url页面生成pdf_如何将PDF页面从横向改成纵向?
  10. MPB:中国农科院李玉中组牧草种子内生真菌的分离、鉴定与保存方法
  11. pc端html转换手机端,一种兼容PC端和手机端WEB界面的实现方法与流程
  12. Offset is outside the bounds of the DataView
  13. PCIE配置空间设置
  14. Java实现桐桐的数学难题
  15. SwipeToLoadLayout布局中添加自定义控件仿美团、饿了吗等下拉效果
  16. Vue中使用友盟CNZZ事件统计
  17. vue中对echarts折线图设置基准线/警告线,可在输入框输入想要的值,并改变已有的基准线的值。
  18. 超前进位加法器 verilog代码
  19. L2-001 紧急救援 (25 分)
  20. 在敲'宅急送'项目的时候遇见的一个小问题

热门文章

  1. 200个可爱的人像Lightroom预设让照片拥有一个新的风格
  2. M301H_ZN兆能-Hi3798MV300/MV300H-当贝纯净桌面-卡刷固件包
  3. 恶意软件分析诀窍与工具箱——对抗“流氓”软件的技术与利器
  4. 山重水复疑无路,柳暗花明又一村——记一次在win7下安装MATLAB的经历
  5. 计算机室免费开放活动方案,免费低收费开放方案
  6. mac os 安装win8.1后BootCamp 控制面板无法设置触摸板
  7. 软件包ipython没有可安装候选_解决python 自动安装缺少模块的问题
  8. 职场中人自我认定的天涯精华帖(链接地址、读后感、经典语录)看完就更新
  9. FM1288回声消除调试经历
  10. python物联网通信_python 物联网