BaseHttpListActivity,几行代码搞定Android Http列表请求、加载和缓存
2016-08-03 09:10
645 查看
Android开发中,向服务器请求一个列表并显示是非常常见的需求,但实现起来比较麻烦,代码繁杂。
随着应用的更新迭代,这种需求越来越多,我渐渐发现了实现这种需求的代码的共同点。
于是我将Activity中http列表请求和加载的相同功能代码提取出来,作为这种Activity的基类,名为BaseHttpListActivity。
之后将缓存功能也集成在BaseHttpListActivity中,然后还根据业务需求衍生出了BaseHttpListFragment。
后来又有了从本地数据库加载列表的需求,就再次从BaseHttpListActivity提取出了BaseListActivity,负责列表显示和缓存。
BaseHttpListActivity只负责http请求,通过继承BaseHttpListActivity来实现显示和缓存。
有了BaseHttpListActivity和BaseHttpListFragment,原来用于实现http列表请求、加载和缓存的代码就变得非常简单了。
比如以下这个界面的主页:
列表是一个UserListFragment,支持下拉刷新上拉加载,第一次进入会直接显示刷新动画并加载数据。
getListAsync用于请求服务器列表数据,setList用于显示列表数据,
parseArray用于将服务器返回的json串转化为一个List<User>的方法。
通过initCache(this);初始化缓存,得到getCacheClass,getCacheGroup,getCacheId这3个缓存方法。
range相关代码是为了传入一个用户范围(或类型),让服务器返回需要范围的数据。
listener事件监听区代码里实现了点击列表项跳转至用户详情界面的功能。
剩下onCreateView和3个init方法维持着这个Fragment的框架。
原来Activity和Fragment中实现同样功能的上千行代码竟然能简化成这样!!!
而且如果是Fragment,有一个XListView[b]默认布局,连layout都不再需要写了!!![/b]
如果只需要从服务器加载一个列表,缓存和事件相关代码就可以去掉了;如果不需要限定数据范围,还可以去掉range相关代码。
是不是更简洁了呢?
BaseHttpListActivity和BaseHttpListFragment已开源,依赖ZBLibrary(含使用方法)就可使用,下方附下载地址。
ZBLibrary-Android快速开发框架
下载地址(欢迎Star,欢迎Fork)
https://github.com/TommyLemon/Android-ZBLibrary
下载试用
ZBLibraryDemoApp.apk
随着应用的更新迭代,这种需求越来越多,我渐渐发现了实现这种需求的代码的共同点。
于是我将Activity中http列表请求和加载的相同功能代码提取出来,作为这种Activity的基类,名为BaseHttpListActivity。
之后将缓存功能也集成在BaseHttpListActivity中,然后还根据业务需求衍生出了BaseHttpListFragment。
后来又有了从本地数据库加载列表的需求,就再次从BaseHttpListActivity提取出了BaseListActivity,负责列表显示和缓存。
BaseHttpListActivity只负责http请求,通过继承BaseHttpListActivity来实现显示和缓存。
有了BaseHttpListActivity和BaseHttpListFragment,原来用于实现http列表请求、加载和缓存的代码就变得非常简单了。
比如以下这个界面的主页:
列表是一个UserListFragment,支持下拉刷新上拉加载,第一次进入会直接显示刷新动画并加载数据。
/**用户列表界面fragment * @author Lemon * @use new UserListFragment(),详细使用见.DemoFragmentActivity(initData方法内) * @must 查看 .HttpManager 中的@must和@warn * 查看 .SettingUtil 中的@must和@warn */ public class UserListFragment extends BaseHttpListFragment<User, UserAdapter> implements OnItemClickListener, OnCacheCallBack<User> { // private static final String TAG = "UserListFragment"; //与Activity通信<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static final String ARGUMENT_RANGE = "ARGUMENT_RANGE"; //与Activity通信>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> public static final int RANGE_ALL = HttpRequest.USER_LIST_RANGE_ALL; public static final int RANGE_RECOMMEND = HttpRequest.USER_LIST_RANGE_RECOMMEND; private int range = RANGE_ALL; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); argument = getArguments(); if (argument != null) { range = argument.getInt(ARGUMENT_RANGE, range); } initCache(this); //功能归类分区方法,必须调用<<<<<<<<<< initView(); initData(); initListener(); //功能归类分区方法,必须调用>>>>>>>>>> lvBaseList.onRefresh(); return view; } //UI显示区(操作UI,但不存在数据获取或处理代码,也不存在事件监听代码)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @Override public void initView() {//必须调用 super.initView(); } @Override public void setList(final List<User> list) { setList(list, new AdapterCallBack<UserAdapter>() { @Override public void refreshAdapter() { adapter.refresh(list); } @Override public UserAdapter createAdapter() { return new UserAdapter(context, list); } }); } //UI显示区(操作UI,但不存在数据获取或处理代码,也不存在事件监听代码)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //data数据区(存在数据获取或处理代码,但不存在事件监听代码)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @Override public void initData() {//必须调用 super.initData(); } @Override public void getListAsync(final int pageNum) { HttpRequest.getUserList(range, pageNum, 0, this); } @Override public List<User> parseArray(String json) { return Json.parseArray(json, User.class); } @Override public Class<User> getCacheClass() { return User.class; } @Override public String getCacheGroup() { return "range=" + range; } @Override public String getCacheId(User data) { return data == null ? null : "" + data.getId(); } //data数据区(存在数据获取或处理代码,但不存在事件监听代码)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //listener事件监听区(只要存在事件监听代码就是)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @Override public void initListener() {//必须调用 super.initListener(); lvBaseList.setOnItemClickListener(this); } //系统自带监听方法 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { position -= lvBaseList.getHeaderViewsCount(); if (position < 0 || adapter == null || position >= adapter.getCount()) { return; } User user = adapter.getItem(position); if (BaseModel.isCorrect(user)) {//相当于 user != null && user.getId() > 0 toActivity(UserActivity.createIntent(context, user.getId())); } } //类相关监听<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< //类相关监听>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //系统自带监听方法>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //listener事件监听区(只要存在事件监听代码就是)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //内部类,尽量少用<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< //内部类,尽量少用>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> }
getListAsync用于请求服务器列表数据,setList用于显示列表数据,
parseArray用于将服务器返回的json串转化为一个List<User>的方法。
通过initCache(this);初始化缓存,得到getCacheClass,getCacheGroup,getCacheId这3个缓存方法。
range相关代码是为了传入一个用户范围(或类型),让服务器返回需要范围的数据。
listener事件监听区代码里实现了点击列表项跳转至用户详情界面的功能。
剩下onCreateView和3个init方法维持着这个Fragment的框架。
原来Activity和Fragment中实现同样功能的上千行代码竟然能简化成这样!!!
而且如果是Fragment,有一个XListView[b]默认布局,连layout都不再需要写了!!![/b]
如果只需要从服务器加载一个列表,缓存和事件相关代码就可以去掉了;如果不需要限定数据范围,还可以去掉range相关代码。
/**用户列表界面fragment * @author Lemon * @use new UserListFragment(),详细使用见.DemoFragmentActivity(initData方法内) * @must 查看 .HttpManager 中的@must和@warn * 查看 .SettingUtil 中的@must和@warn */ public class UserListFragment extends BaseHttpListFragment<User, UserAdapter> { // private static final String TAG = "UserListFragment"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); //功能归类分区方法,必须调用<<<<<<<<<< initView(); initData(); initListener(); //功能归类分区方法,必须调用>>>>>>>>>> lvBaseList.onRefresh(); return view; } //UI显示区(操作UI,但不存在数据获取或处理代码,也不存在事件监听代码)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @Override public void setList(final List<User> list) { setList(list, new AdapterCallBack<UserAdapter>() { @Override public void refreshAdapter() { adapter.refresh(list); } @Override public UserAdapter createAdapter() { return new UserAdapter(context, list); } }); } //UI显示区(操作UI,但不存在数据获取或处理代码,也不存在事件监听代码)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //data数据区(存在数据获取或处理代码,但不存在事件监听代码)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @Override public void getListAsync(final int pageNum) { HttpRequest.getUserList(0, pageNum, 0, this); } @Override public List<User> parseArray(String json) { return Json.parseArray(json, User.class); } //data数据区(存在数据获取或处理代码,但不存在事件监听代码)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //listener事件监听区(只要存在事件监听代码就是)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< //类相关监听<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< //类相关监听>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //系统自带监听方法>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //listener事件监听区(只要存在事件监听代码就是)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //内部类,尽量少用<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< //内部类,尽量少用>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> }
是不是更简洁了呢?
BaseHttpListActivity和BaseHttpListFragment已开源,依赖ZBLibrary(含使用方法)就可使用,下方附下载地址。
ZBLibrary-Android快速开发框架
下载地址(欢迎Star,欢迎Fork)
https://github.com/TommyLemon/Android-ZBLibrary
下载试用
ZBLibraryDemoApp.apk
相关文章推荐
- BaseHttpListActivity,几行代码搞定Android Http列表请求、加载和缓存
- android发送HTTP请求代码,以GET方式发送。
- Android http请求例子、Unicode转UTF-8 java代码收藏
- Android开发全程记录(十六)——android调用接口发送http请求缓存处理
- Android-GridView 实例(异步加载,LruCache缓存,图片请求,图片压缩)
- Android的Http通信加载页面、下载图片 以及doGet、doPost请求服务器
- ListActivity中的自定义列表配置选项『Android系列12』
- Android中使用Json和Xml与服务器进行通信,使用代码发送Get和Post请求,http请求辅助类
- Android http 请求 Json数据缓存到内存
- 重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cookie 读写; 自定义 HttpFilter; 其他
- Android Xutils框架HttpUtil Get请求缓存问题
- 解决Android Http请求处理Response Cookie时区加载过慢问题
- Android短信(baseactivity抽取相同代码块,复用代码,减少工作量)短信管家4
- Android http请求例子、Unicode转UTF-8 java代码
- Android http请求例子、Unicode转UTF-8 java代码收藏
- Android http请求例子、Unicode转UTF-8 java代码收藏
- Android ListView下拉加载更多,http请求加载数据,Item点击事件
- (android 功能代码)Android网络请求库——android-async-http .
- Android 网络:使用URLConnection提交请求,获取html代码加载WebView
- android图片异步加载缓存2(1运行不了但是代码很优雅)