Xutils3的更详细的使用

2019-10-14 13:36:19

参考地址 Xutils和Xutils3的基本使用

 这几天把公司的电商软件第一版完成之后,打算把项目重新优化并排版一下,让软件整体看起来更加美观。作为一名优(lan)雅(duo)的程序猿,一定要时刻保持优雅的情操,比如FindViewById()和SetOnclick等方法,用起来是真心不优雅,打算使用Xutils3的注解功能,之前一直使用的是Xutils,但是Github上面的Xutils已经很久没有更新了,而且Xutils对Android6.0的兼容性不是特别好,于是搜了一下,决定把Xutils和Xutils3的基本知识整理一下方便更多的人学习使用。

一、Xutils简介: Xutils是前几年比较火得一个开源框架,Xutils包含了很多实用的工具类,支持大文件上传,且有更全面的http请求协议支持,拥有灵活的Orm,支持事件注解且不受代码混淆影响。Xutils刚问世的时候真是很多屌丝程序猿的福利啊,集成了这么多功能强大的模块,大家果然都爱不释手,但是随着Android版本的升级和人们开发软件思想的转变,Xutils也暴露出了很多问题,现在用Xutils的已经不是特别的多了,如果想使用的话,推荐使用比较新的Xutils3。

二、Xutils的主要模块:不管是老版本的Xutils还是新版本的Xutils3,总的来说,他们都分了四个重要的模块:ViewUtils,HttpUtils,BitmapUtils,DbUtils。附带的还有一个LogUtils,可以用来输出Log日志,用起来也是蛮方便的。不管是老版本的Xutils还是新版本的Xutils3,总的来说,他们都分了四个重要的模块:ViewUtils,HttpUtils,BitmapUtils,DbUtils。附带的还有一个LogUtils,可以用来输出Log日志,用起来也是蛮方便的。

三、首先要说的是老版本Xutils的4个模块:

ViewUtils模块     主要用来代替findViewById()的,也可以用来给控件添加点击事件

  // xUtils的view注解要求必须提供id,以使代码混淆不受影响。

@ViewInject(R.id.textView)

TextView textView;

 

//@ViewInject(vale=R.id.textView, parentId=R.id.parentView)

//TextView textView;

 

@ResInject(id = R.string.label, type = ResType.String)

private String label;

 

// 取消了之前使用方法名绑定事件的方式,使用id绑定不受混淆影响

// 支持绑定多个id @OnClick({R.id.id1, R.id.id2, R.id.id3})

// or @OnClick(value={R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3})

// 更多事件支持参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。

@OnClick(R.id.test_button)

public void testButtonClick(View v) { // 方法签名必须和接口中的要求一致

...

}

...

//在Activity中注入:

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

ViewUtils.inject(this); //注入view和事件

...

textView.setText("some text...");

...

}

//在Fragment中注入:

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.bitmap_fragment, container, false); // 加载fragment布局

ViewUtils.inject(this, view); //注入view和事件

...

}

//在PreferenceFragment中注入:

public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

ViewUtils.inject(this, getPreferenceScreen()); //注入view和事件

...

}

// 其他重载

// inject(View view);

// inject(Activity activity)

// inject(PreferenceActivity preferenceActivity)

// inject(Object handler, View view)

// inject(Object handler, Activity activity)

// inject(Object handler, PreferenceGroup preferenceGroup)

// inject(Object handler, PreferenceActivity preferenceActivity)

HttpUtils模块    主要用来进行各种常见网络请求和文件下载以及上传。

  /**普通get方法**/

HttpUtils http = new HttpUtils();

http.send(HttpRequest.HttpMethod.GET,

"http://www.lidroid.com",

new RequestCallBack<String>(){

@Override

public void onLoading(long total, long current, boolean isUploading) {

testTextView.setText(current + "/" + total);

}

 

@Override

public void onSuccess(ResponseInfo<String> responseInfo) {

textView.setText(responseInfo.result);

}

 

@Override

public void onStart() {

}

 

@Override

public void onFailure(HttpException error, String msg) {

}

});

/**使用HttpUtils上传文件 或者 提交数据 到服务器(post方法)**/

RequestParams params = new RequestParams();

params.addHeader("name", "value");

params.addQueryStringParameter("name", "value");

 

// 只包含字符串参数时默认使用BodyParamsEntity,

// 类似于UrlEncodedFormEntity("application/x-www-form-urlencoded")。

params.addBodyParameter("name", "value");

 

// 加入文件参数后默认使用MultipartEntity("multipart/form-data"),

// 如需"multipart/related",xUtils中提供的MultipartEntity支持设置subType为"related"。

// 使用params.setBodyEntity(httpEntity)可设置更多类型的HttpEntity(如:

// MultipartEntity,BodyParamsEntity,FileUploadEntity,InputStreamUploadEntity,StringEntity)。

// 例如发送json参数:params.setBodyEntity(new StringEntity(jsonStr,charset));

params.addBodyParameter("file", new File("path"));

 

HttpUtils http = new HttpUtils();

http.send(HttpRequest.HttpMethod.POST,

"uploadUrl....",

params,

new RequestCallBack<String>() {

 

@Override

public void onStart() {

testTextView.setText("conn...");

}

 

@Override

public void onLoading(long total, long current, boolean isUploading) {

if (isUploading) {

testTextView.setText("upload: " + current + "/" + total);

} else {

testTextView.setText("reply: " + current + "/" + total);

}

}

 

@Override

public void onSuccess(ResponseInfo<String> responseInfo) {

testTextView.setText("reply: " + responseInfo.result);

}

 

@Override

public void onFailure(HttpException error, String msg) {

testTextView.setText(error.getExceptionCode() + ":" + msg);

}

});

/**使用HttpUtils下载文件:支持断点续传,随时停止下载任务,开始任务**/

HttpUtils http = new HttpUtils();

HttpHandler handler = http.download("http://apache.dataguru.cn/httpcomponents/httpclient/source/httpcomponents-client-4.2.5-src.zip",

"/sdcard/httpcomponents-client-4.2.5-src.zip",

true, // 如果目标文件存在,接着未完成的部分继续下载。服务器不支持RANGE时将从新下载。

true, // 如果从请求返回信息中获取到文件名,下载完成后自动重命名。

new RequestCallBack<File>() {

 

@Override

public void onStart() {

testTextView.setText("conn...");

}

 

@Override

public void onLoading(long total, long current, boolean isUploading) {

testTextView.setText(current + "/" + total);

}

 

@Override

public void onSuccess(ResponseInfo<File> responseInfo) {

testTextView.setText("downloaded:" + responseInfo.result.getPath());

}

 

 

@Override

public void onFailure(HttpException error, String msg) {

testTextView.setText(msg);

}

});

//调用cancel()方法停止下载

handler.cancel();

BitmapUtils模块    主要用来加载ImageView的图片资源,可以本地图片,也可以是网络图片

   BitmapUtils bitmapUtils = new BitmapUtils(this);

 

 

   // 加载网络图片

   bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");

 

 

   // 加载本地图片(路径以/开头, 绝对路径)

   bitmapUtils.display(testImageView, "/sdcard/test.jpg");

 

 

   // 加载assets中的图片(路径以assets开头)

   bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");

 

 

   // 使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片

   listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));

   listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));

DbUtils模块    主要用来操作数据库的

  DbUtils db = DbUtils.create(this);

User user = new User(); //这里需要注意的是User对象必须有id属性,或者有通过@ID注解的属性

user.setEmail("wyouflf@qq.com");

user.setName("wyouflf");

db.save(user); // 使用saveBindingId保存实体时会为实体的id赋值

 

// 查找

Parent entity = db.findById(Parent.class, parent.getId());

List<Parent> list = db.findAll(Parent.class);//通过类型查找

 

Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=","test"));

 

// IS NULL

Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=", null));

// IS NOT NULL

Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","!=", null));

 

// WHERE id<54 AND (age>20 OR age<30) ORDER BY id LIMIT pageSize OFFSET pageOffset

List<Parent> list = db.findAll(Selector.from(Parent.class)

   .where("id" ,"<", 54)

   .and(WhereBuilder.b("age", ">", 20).or("age", " < ", 30))

   .orderBy("id")

   .limit(pageSize)

   .offset(pageSize * pageIndex));

 

// op为"in"时,最后一个参数必须是数组或Iterable的实现类(例如List等)

Parent test = db.findFirst(Selector.from(Parent.class).where("id", "in", new int[]{1, 2, 3}));

// op为"between"时,最后一个参数必须是数组或Iterable的实现类(例如List等)

Parent test = db.findFirst(Selector.from(Parent.class).where("id", "between", new String[]{"1", "5"}));

 

DbModel dbModel = db.findDbModelAll(Selector.from(Parent.class).select("name"));//select("name")只取出name列

List<DbModel> dbModels = db.findDbModelAll(Selector.from(Parent.class).groupBy("name").select("name", "count(name)"));

 

List<DbModel> dbModels = db.findDbModelAll(sql); // 自定义sql查询

db.execNonQuery(sql) // 执行自定义sql

LogUtils工具类 打印输出日志 

  // 自动添加TAG,格式: className.methodName(L:lineNumber)

// 可设置全局的LogUtils.allowD = false,LogUtils.allowI = false...,控制是否输出log。

// 自定义log输出LogUtils.customLogger = new xxxLogger();

LogUtils.d("打印测试");

ok,关于Xutils的使用就简单地介绍这么多,ViewUtils,HttpUtils,BitmapUtils,DbUtils这4个模块的使用其实还是有一定规律的,除了DbUtils使用create创建对象外,其余的3个模块都是使用new来创建对象的。



四、接下来再说一下Xutils3的4个模块:


xUtils3变化较多所以建立了新的项目不在旧版(github.com/wyouflf/xUtils)上继续维护, 相对于旧版本:

HTTP实现替换HttpClient为UrlConnection, 自动解析回调泛型, 更安全的断点续传策略.

支持标准的Cookie策略, 区分domain, path...

事件注解去除不常用的功能, 提高性能.

数据库api简化提高性能, 达到和greenDao一致的性能.

图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转..

以上是官方的说明,下面来看具体使用。


  Xutils3的使用方式和Xutils有很大的改变,所以请新建一个工程,按照下面的步骤操作:


首先新建一个Application类,在里面对Xutils3做初始化工作:

  // 在application的onCreate中初始化

@Override

public void onCreate() {

super.onCreate();

x.Ext.init(this);

x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.

}

xutils3和Xutils使用方式有一些区别,以前是使用new得到各模块的对象,现在使用:x.模块名()得到对象,回调接口也使用统一的一个,回调接口支持泛型。


ViewUtils的使用基本没有变,只是绑定点击事件的时候有些出入:

  //使用ViewUtils绑定控件

@ViewInject(R.id.txtv)

private TextView txtv;

@ViewInject(R.id.imgv)

private ImageView imgv;

绑定事件:


  /**

* 使用ViewUtils设置按钮的点击事件,方法必须要私有化, 参数格式和type的参数一致,为了混淆方便,方法名要以Event或者Click结尾

* type可以不写,默认是点击事件类型

*/

@Event(value = R.id.btn, type = View.OnClickListener.class)

private void btnClick(View view) {}

HttpUtlis的使用:

  // 请求参数

RequestParams params = new RequestParams("http://www.baidu.com");

x.http().get(params, new CommonCallback<String>() {

 

@Override

public void onCancelled(CancelledException arg0) {

 

}

 

@Override

public void onError(Throwable arg0, boolean arg1) {

 

}

 

@Override

public void onFinished() {

 

}

 

@Override

public void onSuccess(String arg0) {

// 成功下载,显示到txtv上面

txtv.setText(arg0);

}

});

BitmapUtils的使用:

  // 设置加载图片的参数

ImageOptions options = new ImageOptions.Builder()

// 是否忽略GIF格式的图片

.setIgnoreGif(false)

// 图片缩放模式

.setImageScaleType(ScaleType.CENTER_CROP)

// 下载中显示的图片

.setLoadingDrawableId(R.drawable.ic_launcher)

// 下载失败显示的图片

.setFailureDrawableId(R.drawable.ic_launcher)

// 得到ImageOptions对象

.build();

// 加载图片

x.image().bind(imgv, imagUrl, options, new CommonCallback<Drawable>() {

@Override

public void onSuccess(Drawable arg0) {

LogUtil.e("下载成功");

}

 

@Override

public void onFinished() {

LogUtil.e("下载完成");

}

 

@Override

public void onError(Throwable arg0, boolean arg1) {

 

LogUtil.e("下载出错," + arg0.getMessage());

}

 

@Override

public void onCancelled(CancelledException arg0) {

LogUtil.e("下载取消");

}

});

// 加载本地图片

// x.image().bind(imgv, "assets://test.gif", options);

// x.image().bind(iv_big_img, new

// File("/sdcard/test.gif").toURI().toString(), imageOptions);

// x.image().bind(iv_big_img, "/sdcard/test.gif", imageOptions);

// x.image().bind(iv_big_img, "file:///sdcard/test.gif", imageOptions);

// x.image().bind(iv_big_img, "file:/sdcard/test.gif", imageOptions);

DbUtils的使用:

先建一个类,用来生成数据库中的表,这里新建一个StudentInfo类(注意里面的@标签的使用,使用这些标签生成表的结构信息)内容如下:



@Table(name = "info")

public class StudentInfo {

@Column(name = "id", isId = true)

private int id;

@Column(name = "name")

private String name;

@Column(name = "age")

private int age;

 

public int getId() {

return id;

}

 

public void setId(int id) {

this.id = id;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public int getAge() {

return age;

}

 

public void setAge(int age) {

this.age = age;

}

 

}

然后:


DbManager.DaoConfig daoConfig = new DaoConfig()

// 数据库的名字

.setDbName("SudentInfo")

// 保存到指定路径

// .setDbDir(new

// File(Environment.getExternalStorageDirectory().getAbsolutePath()))

// 数据库的版本号

.setDbVersion(1)

// 数据库版本更新监听

.setDbUpgradeListener(new DbUpgradeListener() {

@Override

public void onUpgrade(DbManager arg0, int arg1, int arg2) {

LogUtil.e("数据库版本更新了!");

}

});

DbManager manager = x.getDb(daoConfig);

try {

//创建对象,用来生成表

StudentInfo info = new StudentInfo();

info.setAge(16);

info.setName("小花");

//创建表

manager.saveOrUpdate(info);

} catch (DbException e) {

e.printStackTrace();

}




  • 2019-09-03 23:09:17

    Linux下静态库(.a)和动态库(.so) 的生成与使用以及区别

    静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

  • 2019-09-03 23:19:12

    ./configure 的配置和用法

    Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。

  • 2019-09-04 16:24:17

    Ubuntu apt-get更换为阿里源

    ​进入阿里巴巴开源镜像页面,找到ubuntu,点击后面的帮助,可以看到类似下面的介绍,加入就好。切记下面的第三步。

  • 2019-09-04 16:32:56

    Ubuntu tar 解压缩命令详解

    tar 解压缩命令详解,这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

  • 2019-09-04 16:50:35

    CMake入门笔记

    Make是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

  • 2019-09-05 20:51:15

    在Android上使用FFmpeg压缩视频

    libavcodec-提供了更加全面的编解码实现的合集 libavformat-提供了更加全面的音视频容器格式的封装和解析以及所支持的协议 libavutil-提供了一些公共函数 libavfilter-提供音视频的过滤器,如视频加水印、音频变声等 libavdevice-提供支持众多设备数据的输入与输出,如读取摄像头数据、屏幕录制 libswresample,libavresample-提供音频的重采样工具 libswscale-提供对视频图像进行色彩转换、缩放以及像素格式转换,如图像的YUV转换 libpostproc-多媒体后处理器

  • 2019-09-05 20:54:21

    在Android 中使用FFmpeg命令

    到这里就可以运行FFmpeg命令了。一直我也是这样使用,但是我在做这个项目Cut的时候发现连续调用多次FFmpeg命令会报错(在项目需要,先改变分镜头的速度,再合成视频)。 为什么会这样的呢?