xutils简介
xutils 包含了很多实用的android工具。
xutils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的orm,更多的事件注解支持且不受混淆影响...
xuitls 最低兼容android 2.2 (api level 8)
今天给大家带来xutils3的基本介绍,本文章的案例都是基于xutils3的api语法进行的演示。相信大家对这个框架也都了解过,
下面简单介绍下xutils3的一些基本知识。
xutils3一共有4大功能:注解模块,网络模块,图片加载模块,数据库模块。
使用xutils只需要在libs文件夹里面加入一个jar包,如果对服务器返回的数据进行封装的话,还需要导入一个gson的jar包。
<uses-permission android:name="android.permission.internet" /> <uses-permission android: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) public class mainactivity extends actionbaractivity { @viewinject(r.id.btn_get) button btn_get; @viewinject(r.id.btn_post) button btn_post; @override protected void oncreate(bundle savedinstancestate) { 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}) private void getevent(view view){ switch(view.getid()){ case r.id.btn_get: toast.maketext(mainactivity.this, btn_get.gettext().tostring().trim(), 0).show(); break; case r.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) public class firstfragment extends fragment{ private myadapter adapter; private list<person> list=new arraylist<>(); private list<string> listurl=new arraylist<>(); private list<string> listname=new arraylist<>(); @viewinject(r.id.btn_test) button btn_test; @viewinject(r.id.listview) listview listview; @override public view oncreateview(layoutinflater inflater, @nullable viewgroup container, @nullable bundle savedinstancestate) { return x.view().inject(this, inflater, container); }
viewholder的注解:
public class myadapter extends baseadapter{ private context context; private list<person> list; private layoutinflater minflater; private imageoptions options; public viewholder holder; public myadapter(context context, list<person> list) { this.context = context; this.list = list; this.minflater=layoutinflater.from(context); options=new imageoptions.builder().setloadingdrawableid(r.drawable.ic_launcher) .setloadingdrawableid(r.drawable.ic_launcher).setusememcache(true).setcircular(true).build(); } @override public int getcount() { return list.size(); } @override public object getitem(int position) { return list.get(position); } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { holder=null; if(convertview==null){ convertview=minflater.inflate(r.layout.itemone, null); holder=new viewholder(); x.view().inject(holder,convertview); convertview.settag(holder); } else{ holder=(viewholder) convertview.gettag(); } person bean=list.get(position); holder.tv_name.settext(bean.getname()); x.image().bind(holder.iv_image, bean.getimgurl(), options); return convertview; } class viewholder{ @viewinject(r.id.tv_name) private textview tv_name; @viewinject(r.id.iv_image) private imageview iv_image; }
上面的代码是注解viewholder的标准模式,相信大家完全能够看明白。这里我加载图片使用到了xutils3的加载网络图片的方法。后面我会详细进行讲解。
网络模块
xutils的网络请求方法和一些网络请求框架的用法非常类似,我进行了一些简单的封装。
封装一共有3个文件,分别是网络请求工具类xutil,请求响应数据的解析类,还有一个就是一个请求成功的一个接口回调类。
代码如下:
public class xutil { /** * 发送get请求 * @param <t> */ public static <t> cancelable get(string url,map<string,string> map,commoncallback<t> callback){ requestparams params=new requestparams(url); if(null!=map){ for(map.entry<string, string> entry : map.entryset()){ params.addquerystringparameter(entry.getkey(), entry.getvalue()); } } cancelable cancelable = x.http().get(params, callback); return cancelable; } /** * 发送post请求 * @param <t> */ public static <t> cancelable post(string url,map<string,object> map,commoncallback<t> callback){ requestparams params=new requestparams(url); if(null!=map){ for(map.entry<string, object> entry : map.entryset()){ params.addparameter(entry.getkey(), entry.getvalue()); } } cancelable cancelable = x.http().post(params, callback); return cancelable; } /** * 上传文件 * @param <t> */ public static <t> cancelable uploadfile(string url,map<string,object> map,commoncallback<t> callback){ requestparams params=new requestparams(url); if(null!=map){ for(map.entry<string, object> entry : map.entryset()){ params.addparameter(entry.getkey(), entry.getvalue()); } } params.setmultipart(true); cancelable cancelable = x.http().get(params, callback); return cancelable; } /** * 下载文件 * @param <t> */ public static <t> cancelable downloadfile(string url,string filepath,commoncallback<t> callback){ requestparams params=new requestparams(url); //设置断点续传 params.setautoresume(true); params.setsavefilepath(filepath); cancelable cancelable = x.http().get(params, callback); return cancelable; } } public class jsonresponseparser implements responseparser { //检查服务器返回的响应头信息 @override public void checkresponse(urirequest request) throws throwable { } /** * 转换result为resulttype类型的对象 * * @param resulttype 返回值类型(可能带有泛型信息) * @param resultclass 返回值类型 * @param result 字符串数据 * @return * @throws throwable */ @override public object parse(type resulttype, class<?> resultclass, string result) throws throwable { return new gson().fromjson(result, resultclass); } } public class mycallback<resulttype> implements callback.commoncallback<resulttype>{ @override public void onsuccess(resulttype result) { //可以根据公司的需求进行统一的请求成功的逻辑处理 } @override public void onerror(throwable ex, boolean isoncallback) { //可以根据公司的需求进行统一的请求网络失败的逻辑处理 } @override public void oncancelled(cancelledexception cex) { } @override public void onfinished() { } }
1.发送get请求示例:
//本get请求来自于免费测试接口:http://www.k780.com/api/entry.baidu string url="http://api.k780.com:88/?app=idcard.get"; map<string,string> map=new hashmap<>(); map.put("appkey", "10003"); map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4"); map.put("format", "json"); map.put("idcard", "110101199001011114"); xutil.get(url, map, new mycallback<personinfobean>(){ @override public void onsuccess(personinfobean result) { super.onsuccess(result); log.e("result", result.tostring()); } @override public void onerror(throwable ex, boolean isoncallback) { super.onerror(ex, isoncallback); } });
2.发送post请求
string url="http://api.k780.com:88/?app=idcard.get"; map<string,object> map=new hashmap<>(); map.put("appkey", "10003"); map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4"); map.put("format", "json"); map.put("idcard", "110101199001011114"); xutil.post(url, map, new mycallback<personinfobean>(){ @override public void onsuccess(personinfobean result) { super.onsuccess(result); log.e("result", result.tostring()); } @override public void onerror(throwable ex, boolean isoncallback) { super.onerror(ex, isoncallback); } });
3.上传文件
/** * 上传文件(支持多文件上传) */ private void uploadfile() { //图片上传地址 string url=""; map<string,object> map=new hashmap<>(); //传入自己的相应参数 //map.put(key, value); //map.put(key, value); xutil.uploadfile(url, map, new mycallback<string>(){ @override public void onsuccess(string result) { super.onsuccess(result); } @override public void onerror(throwable ex, boolean isoncallback) { super.onerror(ex, isoncallback); } }); }
4.下载文件
private void downloadfile() { //文件下载地址 string url=""; //文件保存在本地的路径 string filepath=""; xutil.downloadfile(url, filepath,new mycallback<file>(){ @override public void onsuccess(file result) { super.onsuccess(result); } @override public void onerror(throwable ex, boolean isoncallback) { super.onerror(ex, isoncallback); } });
5.下载文件带进度条
private void downloadprogressfile() { //文件下载地址 string url=""; //文件保存在本地的路径 string filepath=""; xutil.downloadfile(url, filepath,new myprogresscallback<file>(){ @override public void onsuccess(file result) { super.onsuccess(result); } @override public void onerror(throwable ex, boolean isoncallback) { super.onerror(ex, isoncallback); } @override public void onloading(long total, long current, boolean isdownloading) { super.onloading(total, current, isdownloading); } }); }
6.发送get请求(服务器以xml格式返回)
private void getxml() { string url="http://flash.weather.com.cn/wmaps/xml/china.xml"; xutil.get(url, null, new mycallback<string>(){ @override public void onsuccess(string xmlstring) { super.onsuccess(xmlstring); try{ xmlpullparserfactory factory = xmlpullparserfactory.newinstance(); xmlpullparser xmlpullparser = factory.newpullparser(); xmlpullparser.setinput(new stringreader(xmlstring)); int eventtype = xmlpullparser.geteventtype(); while (eventtype != xmlpullparser.end_document) { switch (eventtype) { case xmlpullparser.start_tag: string nodename = xmlpullparser.getname(); if ("city".equals(nodename)) { string pname = xmlpullparser.getattributevalue(0); log.e("tag", "city is " + pname); } break; } eventtype = xmlpullparser.next(); } }catch(exception e){ e.printstacktrace(); } } @override public void onerror(throwable ex, boolean isoncallback) { 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, new callback.commoncallback<drawable>() {...}); x.image().loaddrawable(url, imageoptions, new callback.commoncallback<drawable>() {...}); x.image().loadfile(url, imageoptions, new callback.commoncallback<file>() {...});
xutils3的api还是比较简单的,相信大家都可以看懂,第一个参数传入一个view,第二个参数传入一个图片的网络地址,第三个参数一般是加载图片的配置。
下面看一下imageoptions这个类吧:
imageoptions options=new imageoptions.builder() //设置加载过程中的图片 .setloadingdrawableid(r.drawable.ic_launcher) //设置加载失败后的图片 .setfailuredrawableid(r.drawable.ic_launcher) //设置使用缓存 .setusememcache(true) //设置显示圆形图片 .setcircular(true) //设置支持gif .setignoregif(false) .build();
其余的一些配置请参考源码
如果需要对加载的图片进行操作的话,可以使用:
x.image().loaddrawable(url, imageoptions, new callback.commoncallback<drawable>() {...});
通过返回的drawable对象进行图片的处理,满足项目的个性化的要求.
说了这么多,我想大家至少会对xutils3有了一个基本的了解,由于xutils3的数据库的用法比较多,本篇文章不会去涉及,下一篇文章我会为大家详细讲解xutils3的数据库模块。大家赶紧现在动手操作一下吧!本文涉及到的所有实例都会在下面的demo中有涉及到,请自行参考。
如对本文有疑问,
点击进行留言回复!!
您可能感兴趣的文章:
荐 面试官:kafka日志段如何读写都不知道,好意思说精通Kafka吗?
荐 如何写出一份“有理有据使人信服”的Android项目设计文档
荐 灵魂一问,Android中有代替HashMap的方法吗?
intent.setFlag的参数 FLAG_ACTIVITY_CLEAR_TASK 说明
网友评论