Android在AsyncHttpClient框架的基础上定制能直接返回对象数组的框架
2013-11-14 12:15
501 查看
以前听一个大神说过一句借用不知道哪位伟人的话:一个好的方法只有两三行,每个方法只专注一件事。
本着这样的精神,我们在拉取网路数据的时候希望能将拉取和解析分开,然而我们也希望有这样一个方法,传入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<List<Journal>>() {
@Override
public void onStart() {
//mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onSuccess(List<Journal> result) {
//
}
@Override
public void onFailure(String error, String message) {
AppContext.showToast(message + "--" + error);
}
});
}
}
直接就能从onSuccess回调中获取数据,保证了方法的简洁;
GetJournalRequest.java
public class GetJournalRequest extends
AbsAsyncHttpRequest<JSONArray, List<Journal>> {
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<Journal> parseEntity(String parseData) throws JSONException {
List<Journal> data = new ArrayList<Journal>();
JSONObject jsonObject = new JSONObject(parseData);
JSONArray jsonArray = jsonObject.getJSONArray(KEY_PARAM_JOURNALS);
GetJournalParser getJournalParser = new GetJournalParser();
for (int i = 0; i < jsonArray.length(); i++) {
data.add(getJournalParser.parse(jsonArray.getJSONObject(i)));
}
return CollectionsUtil.isNullOrEmpty(data) ? new ArrayList<Journal>()
: data;
}
}
将指向的UIL 和传递方式,还有解析Json都定义在这个类中,这个类继承之AbsAsyncHttpRequest<JSONArray,List<Journal>>
继承的时候设定了要返回的对象数组,
public abstract
class AbsAsyncHttpRequest<E, T>
implements IAsyncHttpRequest<T> 因为都是用泛型所以可以完成上面的设定。
public abstract class AbsAsyncHttpRequest<E, T> implements IAsyncHttpRequest<T> {
public static final String JSON = "json";
private Context mContext;
private HttpRequestParams mParams;
private ResponseParseHandler<T> 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<T> handler) {
request(null, null, handler);
}
@Override
public void request(String prefName, String cacheKey,
final ResponseParseHandler<T> 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<String> 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<String> brp = new BaseResponseParser<String>(
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<String> brp = new BaseResponseParser<String>(
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<Journal> result) {
//
github:https://github.com/xujinyang/AsyncHttpClientByLX
通过这样一个框架作为屌丝程序猿的我也能领会到编程的美和快乐,何况是大神们尼?
本着这样的精神,我们在拉取网路数据的时候希望能将拉取和解析分开,然而我们也希望有这样一个方法,传入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<List<Journal>>() {
@Override
public void onStart() {
//mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onSuccess(List<Journal> result) {
//
}
@Override
public void onFailure(String error, String message) {
AppContext.showToast(message + "--" + error);
}
});
}
}
直接就能从onSuccess回调中获取数据,保证了方法的简洁;
GetJournalRequest.java
public class GetJournalRequest extends
AbsAsyncHttpRequest<JSONArray, List<Journal>> {
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<Journal> parseEntity(String parseData) throws JSONException {
List<Journal> data = new ArrayList<Journal>();
JSONObject jsonObject = new JSONObject(parseData);
JSONArray jsonArray = jsonObject.getJSONArray(KEY_PARAM_JOURNALS);
GetJournalParser getJournalParser = new GetJournalParser();
for (int i = 0; i < jsonArray.length(); i++) {
data.add(getJournalParser.parse(jsonArray.getJSONObject(i)));
}
return CollectionsUtil.isNullOrEmpty(data) ? new ArrayList<Journal>()
: data;
}
}
将指向的UIL 和传递方式,还有解析Json都定义在这个类中,这个类继承之AbsAsyncHttpRequest<JSONArray,List<Journal>>
继承的时候设定了要返回的对象数组,
public abstract
class AbsAsyncHttpRequest<E, T>
implements IAsyncHttpRequest<T> 因为都是用泛型所以可以完成上面的设定。
public abstract class AbsAsyncHttpRequest<E, T> implements IAsyncHttpRequest<T> {
public static final String JSON = "json";
private Context mContext;
private HttpRequestParams mParams;
private ResponseParseHandler<T> 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<T> handler) {
request(null, null, handler);
}
@Override
public void request(String prefName, String cacheKey,
final ResponseParseHandler<T> 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<String> 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<String> brp = new BaseResponseParser<String>(
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<String> brp = new BaseResponseParser<String>(
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<Journal> result) {
//
}方法中省略了很多细节,仅仅是简单分析,有兴趣的小伙伴可以到github上拉下来,自己研究一下,有改进的地方,一定提出了。
github:https://github.com/xujinyang/AsyncHttpClientByLX
通过这样一个框架作为屌丝程序猿的我也能领会到编程的美和快乐,何况是大神们尼?
相关文章推荐
- AndroidAsyncHttp与Gson或者Json组合使用,请求直接返回解析对象
- Android 使用开源框架AsyncHttpClient上传文件到服务器
- Android开源框架--AsyncHttpClient (android-async-http)使用
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- Android网络请求框架--AsyncHttpClient
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- Android核心基础-7.Android 网络通信-2.使用开源项目AsyncHttpClient
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- Android基础的sharedPreferences存储,ListView,以及httpclient,和asynchttp框架请求的使用
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- android-async-http框架库使用基础
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- android-async-http框架库使用基础
- android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件
- android-async-http框架库使用基础
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架
- Android 文件上传 使用AsyncHttpClient开源框架
- android-async-http框架库使用基础
- Android-AsyncHttpClient网络框架