import java.io.File;
import org.apache.http.Header;
import org.gaochun.android.http.AsyncHttpClient;
import org.gaochun.android.http.RequestParams;
import org.gaochun.android.http.network.IRequestCallback;
import org.gaochun.android.http.network.RequestCallBack;
import org.gaochun.model.Result;
import org.gaochun.parser.AbstractParser;
import org.gaochun.utils.Log;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
/**
-
@author gao_chun
-
通用数据通讯类,不涉及认证与授权的数据。
-
这个类的任务:通过相应参数,获取数据对象。
-
这个类不会涉及到URL地址。
*/
public class GenericDataManager {
private static final String TAG = GenericDataManager.class.getSimpleName();
private static GenericDataManager sInstance;
private final String mServerHost; //服务器地址前缀
private final Handler mHandler; //执行异步回调的Handler
private static AsyncHttpClient client; //AsyncHttpClient对象
// 设置超时时间
static{
client = new AsyncHttpClient(); //初始化AsyncHttpClient对象
client.setTimeout(6 * 1000); //设置超时时间(重要)
}
//单例
public static GenericDataManager getInstance() {
if (sInstance == null) {
Log.e(TAG, “ConfigManager.initiate method not called in the application.”);
} // else ignored.
return sInstance;
}
//需要在Application中初始化
public static void initialize(Context applicationContext, String serverHost) {
sInstance = new GenericDataManager(applicationContext, serverHost);
}
private GenericDataManager(Context applicationContext, String serverHost) {
// 初始化Handler,用于在主线程中执行任务
mHandler = new Handler(Looper.getMainLooper());
// 初始化服务器地址
mServerHost = serverHost;
}
/**
-
该方法封装了网络数据请求和数据解析
-
并传入回调接口
-
@param requestId 请求ID
-
@param requestType 请求类型(此处根据传入的常量只提供了get请求和post请求)
-
@param urlString 请求URL
-
@param mParams 请求参数
-
@param parser 通用数据解析抽象解析器
-
@param mCallback 自定义接口回调
*/
private RequestCallBack mRequestCallBack; //该抽象类继承了AsyncHttpResponseHandler,并重写了回调方法
public void dataRequest(final int requestId,String requestType,String urlString,RequestParams mParams,
final AbstractParser mParser,final IRequestCallback mCallback){
Log.i(TAG,“url:—>”+mServerHost + File.separator + urlString);
//请求数据开始之前的回调
if (mCallback != null) {
mHandler.post(new Runnable() {
@Override
public void run() {
mCallback.onRequestStart(requestId);
}
});
} // else ignored
//实例化回调对象
mRequestCallBack = new RequestCallBack() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
String data = new String(responseBody); //获取数据结果
//Log.d(TAG,“服务器获取数据:”+data);
final Result result = mParser.parse(data); //解析类
if (result != null) {
//return the requestId + statusCode + result
mCallback.onRequestSuccess(requestId,statusCode,result); //返回请求成功且解析完成的数据回调
} // else ignored.
}
@Override
public void onStart() {
if (mCallback != null) {
mCallback.onRequestStart(requestId);
} // else ignored
}
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
if (mCallback != null) {
mCallback.onRequestError(requestId,error);
} // else ignored
}
};
//根据传入的 requestType 来switch具体的请求方式(注:JDK1.7中switch()支持字符串常量)
switch (requestType) {
case Constants.REQUEST.GET:
client.get(mServerHost + File.separator + urlString, mParams,mRequestCallBack);
break;
case Constants.REQUEST.POST:
client.post(mServerHost + File.separator + urlString, mParams,mRequestCallBack);
break;
default:
client.get(mServerHost + File.separator + urlString, mParams,mRequestCallBack);
break;
}
}
}
我们需要注意的是该方法中传入的参数,且使用了泛型 :
/**
-
该方法封装了网络数据请求和数据解析
-
并传入回调接口
-
@param requestId 请求ID
-
@param requestType 请求类型(此处根据传入的常量只提供了get请求和post请求)
-
@param urlString 请求URL
-
@param mParams 请求参数
-
@param parser 通用数据解析抽象解析器
-
@param mCallback 自定义接口回调
*/
public void dataRequest(final int requestId,String requestType,String urlString,RequestParams mParams,
final AbstractParser mParser,final IRequestCallback mCallback)
将请求参数,请求类型,请求URL,解析器,回调,传入这个方法中进行处理,回调成功直接取数据
如果项目中需要用到头像上传,下载 等功能, Android-async-http 项目中已经提供了对应的方法,大家可以自己在该类中封装方法。
忙里偷闲的挤时间整理了这篇文章,目的是先给大家简单的介绍框架的使用,让感兴趣的朋友有所了解,下篇博文中会给大家详细介绍dataRequest中的抽象解析类 及 请求参数封装 RequestParameterFactory类,当然也需要整理好源码后给大家共享学习。
如果觉得有需要改进的地方或者好的想法,欢迎大家发表意见。
上门洗车APP — Android客户端开发 前言及业务简介
上门洗车APP — Android客户端开发 之 网络框架封装介绍(一)
上门洗车APP — Android客户端开发 之 网络框架封装介绍(二)
总结
现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。
我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。
Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。
如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
附
(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)
r 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
附
(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)
[外链图片转存中…(img-oGJ2mKka-1643965933151)]