当前位置: 移动技术网 > 移动技术>移动开发>Android > Android中XUtils3框架使用方法详解(一)

Android中XUtils3框架使用方法详解(一)

2019年07月24日  | 移动技术网移动技术  | 我要评论

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中有涉及到,请自行参考。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网