您的位置:首页 > 理论基础 > 计算机网络

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,支持下拉刷新上拉加载,第一次进入会直接显示刷新动画并加载数据。

/**用户列表界面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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐