热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android在AsyncHttpClient框架的基础上定制能直接返回对象数组的框架

以前听一个大神说过一句借用不知道哪位伟人的话:一个好的方法只有两三行,每个方法只专注一件事。本着这样的精神,我们在拉取网路数据的时候希望能将拉取和解析分开,然而我们也希望有这样一个方法,传入UIL和表

以前听一个大神说过一句借用不知道哪位伟人的话:一个好的方法只有两三行,每个方法只专注一件事

本着这样的精神,我们在拉取网路数据的时候希望能将拉取和解析分开,然而我们也希望有这样一个方法,传入UIL和表单数据后,能直接返回解析好的对象数组。所以就有了这样的一个在AsyncHttpClient框架基础上定制的框架。由我的小伙伴lwz大神,和打下手的MoblieXu完成。


项目中用的服务器地址,为自己的小项目中一处拉取JSon,请各位手下留情。


首先看一下,我们希望的结果一个方法传入参数就能返回解析好的对象数组:

public class MainActivity extends Activity {
private TextView tv_showData;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_showData =(TextView) findViewById(R.id.tv_showData);
getWebData();
}

private void getWebData() {
GetJournalRequest getJournalRequest = new GetJournalRequest(
getApplicationContext());
getJournalRequest.request(new ResponseParseHandler>() {
@Override
public void onStart() {
//mProgressBar.setVisibility(View.VISIBLE);
}

@Override
public void onSuccess(List result) {
//
}

@Override
public void onFailure(String error, String message) {
AppContext.showToast(message + "--" + error);
}
});

}
}

直接就能从onSuccess回调中获取数据,保证了方法的简洁;

GetJournalRequest.java

public class GetJournalRequest extends
AbsAsyncHttpRequest> {

public static final String KEY_PARAM_JOURNALS = "Journals";

public GetJournalRequest(Context context) {
super(context);
}

@Override
public String getAPI() {
return API.GETJOURNAL_URL;
}

@Override
public HttpMethod getHttpMethod() {
return HttpMethod.GET;
}

@Override
protected List parseEntity(String parseData) throws JSONException {
List data = new ArrayList();
JSONObject jsOnObject= new JSONObject(parseData);
JSONArray jsOnArray= jsonObject.getJSONArray(KEY_PARAM_JOURNALS);
GetJournalParser getJournalParser = new GetJournalParser();
for (int i = 0; i data.add(getJournalParser.parse(jsonArray.getJSONObject(i)));
}
return CollectionsUtil.isNullOrEmpty(data) ? new ArrayList()
: data;
}
}

将指向的UIL 和传递方式,还有解析Json都定义在这个类中,这个类继承之 AbsAsyncHttpRequest>

继承的时候设定了要返回的对象数组,

public abstractclass AbsAsyncHttpRequest implements IAsyncHttpRequest  因为都是用泛型所以可以完成上面的设定。


public abstract class AbsAsyncHttpRequest implements IAsyncHttpRequest {

public static final String JSON = "json";
private Context mContext;
private HttpRequestParams mParams;
private ResponseParseHandler mHandler;
private String mPrefName;
private String mCacheKey;

public AbsAsyncHttpRequest(Context context) {
mCOntext= context;
}

public void setParams(HttpRequestParams params) {
mParams = params;
}

public abstract String getAPI();

public abstract HttpMethod getHttpMethod();

public void request(final ResponseParseHandler handler) {
request(null, null, handler);
}

@Override
public void request(String prefName, String cacheKey,
final ResponseParseHandler handler) {
this.mPrefName = prefName;
this.mCacheKey = cacheKey;
mHandler = handler;
mResponse.updatePreNames(mContext,mPrefName, mCacheKey);
if (getHttpMethod() == HttpMethod.GET) {
doGet();
} else {
doPost();
}
}

private void doGet() {
if (isParamsEmpty(mParams)) {
RequestClient.get(getAPI(), mResponse);
} else {
RequestClient.get(getUrlWithParams(getAPI(), mParams), mResponse);
}
}

private void doPost() {
if (isParamsEmpty(mParams)) {
RequestClient.post(getAPI(), mResponse);
} else {
RequestClient.post(getAPI(), mParams.toString(), mResponse);
}
}

private boolean isParamsEmpty(HttpRequestParams params) {
return params == null || params.isEmpty();
}

private String getUrlWithParams(String url, HttpRequestParams params) {
Set keySet = params.keySet();
StringBuffer sb = new StringBuffer();
sb.append("?");
int i=0;
for (String key : keySet) {
i++;
if(i==keySet.size()){
sb.append(key + "=" + params.get(key));
}else{
sb.append(key + "=" + params.get(key)+"&");
}
}
AppContext.showLog("GET方式URL" + url + sb.toString());
return url + sb.toString();
}

private AsyncHttpResponse mRespOnse= new AsyncHttpResponse(mContext,
mPrefName, mCacheKey, new LoadDataHandler() {

@Override
public void onStart() {
//AppContext.showLog("onRequestStart");
mHandler.onStart();
}

@Override
public void onLoadCaches(String data) {
//AppContext.showLog("onLoadCaches");
mHandler.onLoadCaches(parse(data));
}

@Override
public void onSuccess(String data) {
//AppContext.showLog("成功获得Json数据" + data);
mHandler.onSuccess(parse(data));
}

@Override
public void onFinished() {
//AppContext.showLog("onFinished");
mHandler.onFinished();
}

@Override
public void onFailure(String error, String message) {
AppContext.showLog(error + " " + message);
mHandler.onFailure(error, message);
}

});

private T parse(String responseData) {
JSONObject jsonData;
try {
jsOnData= new JSONObject(responseData);
BaseResponseParser brp = new BaseResponseParser(
jsonData);
if (brp.isSucceed()) {
return parseEntity(brp.getData());
} else {
mHandler.onFailure(brp.getErrorCode(), brp.getErrorMessage());
}
} catch (JSONException e) {
mHandler.onFailure("-1", e.getMessage());
}
return null;
}

protected abstract T parseEntity(String parseData) throws JSONException;
}


这里就是继承之AsyncHttpClient的基础类IAsyncHttpRequest,关键的是获取到数据之后将数据返回给了借口方法:

mHandler.onSuccess(parse(data));


private T parse(String responseData) {
JSONObject jsonData;
try {
jsOnData= new JSONObject(responseData);
BaseResponseParser brp = new BaseResponseParser(
jsonData);
if (brp.isSucceed()) {
return parseEntity(brp.getData());
} else {
mHandler.onFailure(brp.getErrorCode(), brp.getErrorMessage());
}
} catch (JSONException e) {
mHandler.onFailure("-1", e.getMessage());
}
return null;
}

而parse方法,完成了json最基础的解析,比如说判断ret标识,如果数据没有错误的话,那么执行 parseEntity

protected abstract T parseEntity(String parseData)throws JSONException;

这是一个抽象方法,具体的实现是在继承它的子类里面实现,所以这样也就实现了将解析和拉取分开,要解析成什么对象,由继承它的类决定,这个parseEntity就像一个钩子,最后又把解析好的对象数组返回回来,交给接口mHandler.onSuccess(parse(data));最有趣的是这个接口的实现也就是我们最外面调用的

@Override
public void onSuccess(List result) {
//
}
方法中省略了很多细节,仅仅是简单分析,有兴趣的小伙伴可以到github上拉下来,自己研究一下,有改进的地方,一定提出了。

github:https://github.com/xujinyang/AsyncHttpClientByLX


通过这样一个框架作为屌丝程序猿的我也能领会到编程的美和快乐,何况是大神们尼?













推荐阅读
  • C#爬虫Fiddler插件开发自动生成代码
    哈喽^_^一般我们在编写网页爬虫的时候经常会使用到Fiddler这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • 这个报错出现在userDao里面,sessionfactory没有注入。解决办法:spring整合Hibernate使用test测试时要把spring.xml和spring-hib ... [详细]
  • 匠心|传统_2021年度总结 | 葡萄城软件开发技术回顾(上)
    匠心|传统_2021年度总结 | 葡萄城软件开发技术回顾(上) ... [详细]
  • ECharts图表绘制函数集
    本文档提供了使用ECharts库创建柱状图、饼图和双折线图的JavaScript函数。每个函数都详细列出了参数说明,并通过示例展示了如何调用这些函数以生成不同类型的图表。 ... [详细]
  • 本文详细介绍了Python中的流程控制与条件判断技术,包括数据导入、数据变换、统计描述、假设检验、可视化以及自定义函数的创建等方面的内容。 ... [详细]
  • 本文详细介绍了如何通过配置 Chrome 和 VS Code 来实现对 Vue 项目的高效调试。步骤包括启用 Chrome 的远程调试功能、安装 VS Code 插件以及正确配置 launch.json 文件。 ... [详细]
  • 深入解析Spring Boot项目的启动机制
    在Java后端开发中,Spring Boot框架以其简洁性和强大的功能受到了广泛欢迎。本文将探讨Spring Boot项目启动的核心——SpringApplication类及其run()方法的工作原理。 ... [详细]
  • 本文介绍如何使用Java实现AC自动机(Aho-Corasick算法),以实现高效的多模式字符串匹配。文章涵盖了Trie树和KMP算法的基础知识,并提供了一个详细的代码示例,包括构建Trie树、设置失败指针以及执行搜索的过程。 ... [详细]
  • 本文探讨了Flutter和Angular这两个流行框架的主要区别,包括它们的设计理念、适用场景及技术实现。 ... [详细]
  • Phoenix-Android:实现流畅的下拉刷新体验
    介绍Phoenix-Android库,一个用于Android应用的简单且高度可定制的下拉刷新组件。 ... [详细]
  • Qt应用开发:创建基本窗口
    本文介绍如何使用Qt框架创建基础窗口的两种方法。第一种方法直接在main函数中创建并显示窗口;第二种方法通过定义一个继承自QWidget的类来实现更复杂的功能。 ... [详细]
  • 本文旨在为初学者提供一个详细的指南,从零开始学习如何使用 ASP.NET MVC5 和 Entity Framework 6 (EF6) 搭建项目。通过逐步指导,帮助读者理解 MVC 架构的核心概念,并掌握基本的操作方法。 ... [详细]
  • 使用Objective-C实现苹果官方NSLayoutConstraint页面布局
    本文详细介绍了如何在iOS开发中使用Objective-C语言通过NSLayoutConstraint来实现页面布局。示例代码展示了如何创建和应用约束,以确保界面元素能够正确地响应不同屏幕尺寸的变化。 ... [详细]
  • Web网络基础
    目录儿1使用HTTP协议访问Web2HTTP的诞生2.1因特网的起源2.2互联网、因特网与万维网2.3万维网与HTTP3网络基础TCPIP3.1TCPIP协议族3.2TCPIP的分 ... [详细]
author-avatar
为谁落慕
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有