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框架使用方法详解(一),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!