Android中XUtils3框架使用方法详解(一)
xUtils简介
xUtils包含了很多实用的android工具。
xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...
xUitls最低兼容android2.2(apilevel8)
今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示。相信大家对这个框架也都了解过,
下面简单介绍下XUtils3的一些基本知识。
XUtils3一共有4大功能:注解模块,网络模块,图片加载模块,数据库模块。
使用XUtils只需要在libs文件夹里面加入一个jar包,如果对服务器返回的数据进行封装的话,还需要导入一个Gson的jar包。
<uses-permissionandroid:name="android.permission.INTERNET"/> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
注解模块
Activity的注解
1.在Application的oncreate方法中加入下面代码:
x.Ext.init(this);
2.在Activity的oncreate方法中加入下面代码:
x.view().inject(this);
3.加载当前的Activity布局需要如下注解:
@ContentView加入到Activity的上方
4.给View进行初始化需要如下注解:
@InjectView
5.处理控件的各种响应事件需要如下注解:
@Envent
@ContentView(R.layout.activity_main)
publicclassMainActivityextendsActionBarActivity{
@ViewInject(R.id.btn_get)
Buttonbtn_get;
@ViewInject(R.id.btn_post)
Buttonbtn_post;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
x.view().inject(this);
btn_get.setText("发送get请求");
btn_post.setText("发送post请求");
}
//等同于@Event(value={R.id.btn_get,R.id.btn_post},type=View.OnClickListener.class)
@Event(value={R.id.btn_get,R.id.btn_post})
privatevoidgetEvent(Viewview){
switch(view.getId()){
caseR.id.btn_get:
Toast.makeText(MainActivity.this,btn_get.getText().toString().trim(),0).show();
break;
caseR.id.btn_post:
Toast.makeText(MainActivity.this,btn_post.getText().toString().trim(),0).show();
break;
}
}
通过测试,我们发现当点击btn_get按钮时,弹出了“发送get请求”的效果。到这里,大家算是对XUtils的注解有个一个基本的认识,下面我在强调一点的是,@Event这个注解默认情况下type属性为View.OnClickListener.class.如果你想实现其余点击事件效果,只需要把type值进行修改即可。
另外需要注意的一点是按钮的点击事件必须用private进行修饰。
Fragment的注解:
@ContentView(R.layout.fragment_first)
publicclassFirstFragmentextendsFragment{
privateMyAdapteradapter;
privateList<Person>list=newArrayList<>();
privateList<String>listUrl=newArrayList<>();
privateList<String>listName=newArrayList<>();
@ViewInject(R.id.btn_test)
Buttonbtn_test;
@ViewInject(R.id.listView)
ListViewlistView;
@Override
publicViewonCreateView(LayoutInflaterinflater,
@NullableViewGroupcontainer,@NullableBundlesavedInstanceState){
returnx.view().inject(this,inflater,container);
}
ViewHolder的注解:
publicclassMyAdapterextendsBaseAdapter{
privateContextcontext;
privateList<Person>list;
privateLayoutInflatermInflater;
privateImageOptionsoptions;
publicViewHolderholder;
publicMyAdapter(Contextcontext,List<Person>list){
this.context=context;
this.list=list;
this.mInflater=LayoutInflater.from(context);
options=newImageOptions.Builder().setLoadingDrawableId(R.drawable.ic_launcher)
.setLoadingDrawableId(R.drawable.ic_launcher).setUseMemCache(true).setCircular(true).build();
}
@Override
publicintgetCount(){
returnlist.size();
}
@Override
publicObjectgetItem(intposition){
returnlist.get(position);
}
@Override
publiclonggetItemId(intposition){
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
holder=null;
if(convertView==null){
convertView=mInflater.inflate(R.layout.itemone,null);
holder=newViewHolder();
x.view().inject(holder,convertView);
convertView.setTag(holder);
}
else{
holder=(ViewHolder)convertView.getTag();
}
Personbean=list.get(position);
holder.tv_name.setText(bean.getName());
x.image().bind(holder.iv_image,bean.getImgUrl(),options);
returnconvertView;
}
classViewHolder{
@ViewInject(R.id.tv_name)
privateTextViewtv_name;
@ViewInject(R.id.iv_image)
privateImageViewiv_image;
}
上面的代码是注解ViewHolder的标准模式,相信大家完全能够看明白。这里我加载图片使用到了XUtils3的加载网络图片的方法。后面我会详细进行讲解。
网络模块
XUtils的网络请求方法和一些网络请求框架的用法非常类似,我进行了一些简单的封装。
封装一共有3个文件,分别是网络请求工具类XUtil,请求响应数据的解析类,还有一个就是一个请求成功的一个接口回调类。
代码如下:
publicclassXUtil{
/**
*发送get请求
*@param<T>
*/
publicstatic<T>CancelableGet(Stringurl,Map<String,String>map,CommonCallback<T>callback){
RequestParamsparams=newRequestParams(url);
if(null!=map){
for(Map.Entry<String,String>entry:map.entrySet()){
params.addQueryStringParameter(entry.getKey(),entry.getValue());
}
}
Cancelablecancelable=x.http().get(params,callback);
returncancelable;
}
/**
*发送post请求
*@param<T>
*/
publicstatic<T>CancelablePost(Stringurl,Map<String,Object>map,CommonCallback<T>callback){
RequestParamsparams=newRequestParams(url);
if(null!=map){
for(Map.Entry<String,Object>entry:map.entrySet()){
params.addParameter(entry.getKey(),entry.getValue());
}
}
Cancelablecancelable=x.http().post(params,callback);
returncancelable;
}
/**
*上传文件
*@param<T>
*/
publicstatic<T>CancelableUpLoadFile(Stringurl,Map<String,Object>map,CommonCallback<T>callback){
RequestParamsparams=newRequestParams(url);
if(null!=map){
for(Map.Entry<String,Object>entry:map.entrySet()){
params.addParameter(entry.getKey(),entry.getValue());
}
}
params.setMultipart(true);
Cancelablecancelable=x.http().get(params,callback);
returncancelable;
}
/**
*下载文件
*@param<T>
*/
publicstatic<T>CancelableDownLoadFile(Stringurl,Stringfilepath,CommonCallback<T>callback){
RequestParamsparams=newRequestParams(url);
//设置断点续传
params.setAutoResume(true);
params.setSaveFilePath(filepath);
Cancelablecancelable=x.http().get(params,callback);
returncancelable;
}
}
publicclassJsonResponseParserimplementsResponseParser{
//检查服务器返回的响应头信息
@Override
publicvoidcheckResponse(UriRequestrequest)throwsThrowable{
}
/**
*转换result为resultType类型的对象
*
*@paramresultType返回值类型(可能带有泛型信息)
*@paramresultClass返回值类型
*@paramresult字符串数据
*@return
*@throwsThrowable
*/
@Override
publicObjectparse(TyperesultType,Class<?>resultClass,Stringresult)throwsThrowable{
returnnewGson().fromJson(result,resultClass);
}
}
publicclassMyCallBack<ResultType>implementsCallback.CommonCallback<ResultType>{
@Override
publicvoidonSuccess(ResultTyperesult){
//可以根据公司的需求进行统一的请求成功的逻辑处理
}
@Override
publicvoidonError(Throwableex,booleanisOnCallback){
//可以根据公司的需求进行统一的请求网络失败的逻辑处理
}
@Override
publicvoidonCancelled(CancelledExceptioncex){
}
@Override
publicvoidonFinished(){
}
}
1.发送get请求示例:
//本get请求来自于免费测试接口:http://www.k780.com/api/entry.baidu
Stringurl="http://api.k780.com:88/?app=idcard.get";
Map<String,String>map=newHashMap<>();
map.put("appkey","10003");
map.put("sign","b59bc3ef6191eb9f747dd4e83c99f2a4");
map.put("format","json");
map.put("idcard","110101199001011114");
XUtil.Get(url,map,newMyCallBack<PersonInfoBean>(){
@Override
publicvoidonSuccess(PersonInfoBeanresult){
super.onSuccess(result);
Log.e("result",result.toString());
}
@Override
publicvoidonError(Throwableex,booleanisOnCallback){
super.onError(ex,isOnCallback);
}
});
2.发送post请求
Stringurl="http://api.k780.com:88/?app=idcard.get";
Map<String,Object>map=newHashMap<>();
map.put("appkey","10003");
map.put("sign","b59bc3ef6191eb9f747dd4e83c99f2a4");
map.put("format","json");
map.put("idcard","110101199001011114");
XUtil.Post(url,map,newMyCallBack<PersonInfoBean>(){
@Override
publicvoidonSuccess(PersonInfoBeanresult){
super.onSuccess(result);
Log.e("result",result.toString());
}
@Override
publicvoidonError(Throwableex,booleanisOnCallback){
super.onError(ex,isOnCallback);
}
});
3.上传文件
/**
*上传文件(支持多文件上传)
*/
privatevoiduploadfile(){
//图片上传地址
Stringurl="";
Map<String,Object>map=newHashMap<>();
//传入自己的相应参数
//map.put(key,value);
//map.put(key,value);
XUtil.UpLoadFile(url,map,newMyCallBack<String>(){
@Override
publicvoidonSuccess(Stringresult){
super.onSuccess(result);
}
@Override
publicvoidonError(Throwableex,booleanisOnCallback){
super.onError(ex,isOnCallback);
}
});
}
4.下载文件
privatevoiddownloadfile(){
//文件下载地址
Stringurl="";
//文件保存在本地的路径
Stringfilepath="";
XUtil.DownLoadFile(url,filepath,newMyCallBack<File>(){
@Override
publicvoidonSuccess(Fileresult){
super.onSuccess(result);
}
@Override
publicvoidonError(Throwableex,booleanisOnCallback){
super.onError(ex,isOnCallback);
}
});
5.下载文件带进度条
privatevoiddownloadprogressfile(){
//文件下载地址
Stringurl="";
//文件保存在本地的路径
Stringfilepath="";
XUtil.DownLoadFile(url,filepath,newMyProgressCallBack<File>(){
@Override
publicvoidonSuccess(Fileresult){
super.onSuccess(result);
}
@Override
publicvoidonError(Throwableex,booleanisOnCallback){
super.onError(ex,isOnCallback);
}
@Override
publicvoidonLoading(longtotal,longcurrent,
booleanisDownloading){
super.onLoading(total,current,isDownloading);
}
});
}
6.发送get请求(服务器以xml格式返回)
privatevoidgetxml(){
Stringurl="http://flash.weather.com.cn/wmaps/xml/china.xml";
XUtil.Get(url,null,newMyCallBack<String>(){
@Override
publicvoidonSuccess(StringxmlString){
super.onSuccess(xmlString);
try{
XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
XmlPullParserxmlPullParser=factory.newPullParser();
xmlPullParser.setInput(newStringReader(xmlString));
inteventType=xmlPullParser.getEventType();
while(eventType!=XmlPullParser.END_DOCUMENT){
switch(eventType){
caseXmlPullParser.START_TAG:
StringnodeName=xmlPullParser.getName();
if("city".equals(nodeName)){
StringpName=xmlPullParser.getAttributeValue(0);
Log.e("TAG","cityis"+pName);
}
break;
}
eventType=xmlPullParser.next();
}
}catch(Exceptione){
e.printStackTrace();
}
}
@Override
publicvoidonError(Throwableex,booleanisOnCallback){
super.onError(ex,isOnCallback);
}
});
}
图片加载模块
用法:
x.image().bind(imageView,url,imageOptions);
x.image().bind(imageView,"file:///sdcard/test.gif",imageOptions);
x.image().bind(imageView,"assets://test.gif",imageOptions);
x.image().bind(imageView,url,imageOptions,newCallback.CommonCallback<Drawable>(){...});
x.image().loadDrawable(url,imageOptions,newCallback.CommonCallback<Drawable>(){...});
x.image().loadFile(url,imageOptions,newCallback.CommonCallback<File>(){...});
Xutils3的api还是比较简单的,相信大家都可以看懂,第一个参数传入一个View,第二个参数传入一个图片的网络地址,第三个参数一般是加载图片的配置。
下面看一下ImageOptions这个类吧:
ImageOptionsoptions=newImageOptions.Builder() //设置加载过程中的图片 .setLoadingDrawableId(R.drawable.ic_launcher) //设置加载失败后的图片 .setFailureDrawableId(R.drawable.ic_launcher) //设置使用缓存 .setUseMemCache(true) //设置显示圆形图片 .setCircular(true) //设置支持gif .setIgnoreGif(false) .build();
其余的一些配置请参考源码
如果需要对加载的图片进行操作的话,可以使用:
x.image().loadDrawable(url,imageOptions,newCallback.CommonCallback<Drawable>(){...});
通过返回的Drawable对象进行图片的处理,满足项目的个性化的要求.
说了这么多,我想大家至少会对XUtils3有了一个基本的了解,由于XUtils3的数据库的用法比较多,本篇文章不会去涉及,下一篇文章我会为大家详细讲解XUtils3的数据库模块。大家赶紧现在动手操作一下吧!本文涉及到的所有实例都会在下面的demo中有涉及到,请自行参考。
相关阅读:
以上所述是小编给大家介绍的Android中XUtils3框架使用方法详解(一),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!