xUtils框架
参考自:http://www.android100.org/html/201606/19/243677.html
xUtils 是一个工具类的集合体,其中包含许多实用的Android工具,主要包含四大模块:
1、ViewUtils的模块
2、HttpUtils的模块
3、BitmapUtils的模块
4、DBUtils的模块
现在有两个版本:2.6.14版本和3.3.36版本,使用上会有差别;
(一)ViewUtils模块
三种用途:1、控件注解 2、资源注解 3、控件的回调方法的注解
注意:所有用到的IOC成员变量,使用的时候
在activity中必须写在x.view().inject(this)(低版本的注入导包时要注意,v7包下也有ViewUtils,不要导错,ViewUtils.inject(this);)之后
在fragment中需要在加载视图view之后,(低版本)ViewUtils.inject(this, view)
相当于给activity了使用xUtils的权限,不然程序会崩溃()
a、控件的注解
// 1、 控件的注解,进行UI绑定,无需findViewById()
@ViewInject(R.id.txtShow)
private TextView txtShow;
b、资源注解(低版本可用)(要有type指明是什么资源)
// 2、资源的注解(eg:字符串)
// @ResInject (id = R.string.app_name , type = ResType.String)
// private String hehe;
c、控件的回调方法的注解
被注解的方法的要求:
1、必须以private修饰
2、返回值类型
当方法的返回值类型为void的时,返回值类型为任意(意思是给我了我并不用)
当方法的返回值类型不是void时,返回值类型必须是被注解的方法的返回值类型(意思是我要的必须给我)
3、参数签名和type的接口要求的参数签名一致(参数签名指:个数、类型、顺序),否则会报非法的参数异常
备注:
1、value为控件的id集合;注解参数支持数组:value={id1,id2}
2、type为事件类型,默认为点击事件;
3、如果type的接口类型提供多个方法,则需要使用method指定方法名
案例代码:
public class ViewInjectActivity extends AppCompatActivity {
// 1、 控件的注解,进行UI绑定,无需findViewById()
@ViewInject(R.id.txtShow)
private TextView txtShow;
@ViewInject(R.id.vpShow)
private ViewPager vpShow;
// 2、资源的注解(eg:字符串)
// @ResInject (id = R.string.app_name , type = ResType.String)
// private String hehe;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_inject);
/**
* ViewUtils的使用:
* 1、控件注解 2、资源注解 3、控件的回调方法的注解
* 所有用到的IOC成员变量,使用的时候必须写在x.view().inject(this)之后,不然程序会崩溃
*
*/
x.view().inject(this);
setData();
txtShow.setText("this is demo1");
}
private void setData() {
final List<ImageView> list = new ArrayList<>();
int[] resId = new int[]{R.drawable.a1,R.drawable.a2,R.drawable.a3};
for (int i = 0;i<resId.length;i++){
ImageView iv = new ImageView(this);
iv.setImageResource(resId[i]);
list.add(iv);
}
vpShow.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return list.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view ==object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(list.get(position));
return list.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(list.get(position));
}
});
}
/**
* 3、回调方法的注解
* 备注:
* value为控件的id集合;注解参数支持数组:value={id1,id2}
* type为事件类型,默认为点击事件;
* 如果type的接口类型提供多个方法,则需要使用method指定方法名
*
*
* 被注解的方法的要求:
* 1、必须以private修饰
* 2、返回值类型
* 当方法的返回值类型为void的时,返回值类型为任意(意思是给我了我并不用)
* 当方法的返回值类型不是void时,返回值类型必须是被注解的方法的返回值类型(意思是我要的必须给我)
* 3、参数签名和type的接口要求的参数签名一致(参数签名指:个数、类型、顺序),否则会报非法的参数异常
*/
// 你可以给我但我不用
@Event(R.id.btnShow)
private boolean abc(View view){
txtShow.setText("click one");
return false;
}
// @Event(R.id.btnShow)
// private void abc(View v){
// txtShow.setText("click one ..");
// }
// 我要的必须给我
@Event(value = R.id.btnShow3,type = View.OnLongClickListener.class)
private boolean efg(View view){
txtShow.setText("long click me");
return false;
}
// 当type中提供多个方法,用method指定方法名
@Event(value = R.id.vpShow,type = ViewPager.OnPageChangeListener.class,method = "onPageSelected")
private void hij(int position){
txtShow.setText("this is "+(position+1)+" page");
}
// @Event({R.id.btnShow,R.id.btnShow1})
// private String abc(View v){
// switch (v.getId()){
// case R.id.btnShow:
// txtShow.setText("click one one");
// break;
// case R.id.btnShow1:
// txtShow.setText("click two two");
// break;
// }
// return null;
// }
}
(二)HttpUtils模块
相比于使用OkHttp,可以简化代码,其实两行代码就可以实现从网络上获取资源
案例代码:
public class HttpUtilsActivity extends AppCompatActivity {
private Callback.Cancelable mCancelable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_http_utils);
}
//注意:需要在application创建时初始化xUtils
/**
* xUtils初始化步骤:
* 1、创建自己的application类,在onCreate方法中执行x.Ext.init(this);代码
* 2、别忘了在manifest文件里,application标签中添加name属性
* @param view
*/
public void get(View view) {
String url = "http://api.fengniao.com//app_ipad/pic_bbs_list_v2.php?appImei=000000000000000&osType=Android&osVersion=4.1.1&fid=24&page=1";
RequestParams entity = new RequestParams(url);
// CommonCallback相当于一直在监听请求的状态
mCancelable = x.http().get(entity, new Callback.CommonCallback<String>() {
// 请求成功的回调方法
@Override
public void onSuccess(String result) {
Toast.makeText(HttpUtilsActivity.this,"result:"+result,Toast.LENGTH_LONG).show();
}
// 请求失败的回调方法
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Toast.makeText(HttpUtilsActivity.this, "请求失败的回调方法", Toast.LENGTH_SHORT).show();
}
// 取消请求的回调方法
@Override
public void onCancelled(CancelledException cex) {
Toast.makeText(HttpUtilsActivity.this, "取消请求的回调方法", Toast.LENGTH_SHORT).show();
}
// 请求完成的回调方法(不管请求成功与否,均会调用此方法)
@Override
public void onFinished() {
Toast.makeText(HttpUtilsActivity.this, "请求完成的回调方法", Toast.LENGTH_SHORT).show();
}
});
}
public void post(View view) {
// 与get方法的不同
/**
* 1、需要在RequestParams params = new RequestParams(url);之后
* 增加代码: params.addBodyParameter("user","admin"); user对应表单中的标签名 ,admin对应服务器端保存的值
* params.addBodyParameter("pass","123456"); 如上
* 2、调用的是x.http().post(RequestParams params,CommonCallback<> callback);
*
*/
}
}
(三)BitmapUtils
1、加载Bitmap的时候无需考虑Bitmap加载过程中出现的OOM和Android容器快速滑动时候出现的图片错位等现象;
2、支持加载网络图片和本地图片;
3、内存管理使用LRU算法,更好的管理bitmap内存;
4、可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。
低版本的使用:
1、加载网络图片
BitmapUtils bitmapUtils = new BitmapUtils(this);
bitmapUtils.display(testImageView, “http://bbs.lidroid.com/static/image/common/logo.png“);
2、加载本地图片(路径以/开头, 绝对路径)
BitmapUtils bitmapUtils = new BitmapUtils(this);
bitmapUtils.display(testImageView, “/sdcard/test.jpg”);
3、加载assets中的图片(路径以assets开头)
BitmapUtils bitmapUtils = new BitmapUtils(this);
bitmapUtils.display(testImageView, “assets/img/wallpaper.jpg”);
4、使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片
BitmapUtils bitmapUtils = new BitmapUtils(this);
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));
高版本的使用:
案例代码:
public class ImageActivity extends AppCompatActivity{
@ViewInject(R.id.iv)
private ImageView iv;
// 建造者类,可以添加对ImageView显示图片的设置
private ImageOptions options;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image);
x.view().inject(this);
options = new ImageOptions.Builder()
// 设置图片的保存质量
.setConfig(Bitmap.Config.ARGB_8888)
// 设置图片下载失败时显示的图片(当没有网络时会显示)(当地址错误会XX)
.setFailureDrawableId(R.drawable.a3)
// 设置正在加载的图片
.setLoadingDrawableId(R.drawable.a1)
// 设置图片是否是圆形 ;注意:慎用,是对图片的处理,不是直接操作ImageView;
.setCircular(true)
// 设置图片是否渐入
.setFadeIn(true)
// 设置是否使用缓存;注意:此处是3g缓存功能;
.setUseMemCache(true)
// 设置是否忽略gif图片
.setIgnoreGif(true)
// .setIgnoreGif(false)
.build();
}
public void click(View view) {
// String url = "http://ww1.sinaimg.cn/mw690/4b08ac5ejw1f8n24jqt3oj22yo4g0kjs.jpg";
String url = "http://qq.yh31.com/tp/zjbq/201512052121443594.gif";
// 将要ImageView控件与图片的url和对控件显示图片的一些设置绑定在一起
x.image().bind(iv,url,options);
}
//*****************************************************************
//注意:ImageView加载图片过程:最开始会从内存里加载图片,如果找到图片就会直接返回图片,如果没有就会从硬盘缓存里面去取图片,
//如果硬盘缓存还没有就会从网络加载图片;从网络加载图片,会存一份在内存中,同时存一份在外存SDcard中;
//********************************************************************
}