xUtils3.0框架学习笔记分享

xUtils是开速开发安卓项目的开源框架,开源项目地址:https://github.com/wyouflf/xUtils3。使用起来非常方便。主要功能包括:

1、xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词)。

2、拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响。

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

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

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

控件及事件注解绑定,方便高效HTTP请求,简单地数据库操作方式,确实是一款非常有助于我们快速开发项目的开源框架。 
参考github上面demo及相关资料,写了一个学习的demo,分别从注解,图片,HTTP及数据库四个方面进行了代码编写。

首先是在AndroidStudio中配置项目:
第一步:
在AndroidStudio项目的build.gradle文件中添加compile ‘org.xutils:xutils:3.3.36':

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' compile 'org.xutils:xutils:3.3.36' }

添加好后build下工程即可。

第二步:
在AndroidManifest.xml中添加对应权限:

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

第三步:在项目中自定义Application,初始化xUtils3.0。

/** * description: * 作者:ldm * 时间:20162016/6/22 09:03 * 邮箱:1786911211@qq.com */ public class BaseApplication extends Application { @Override public void onCreate() { super.onCreate(); x.Ext.init(this);//在自定义的Application中初始化XUtils3.0 } }

记得把我们定义的Application配置到AndroidManifest.xml中。
接下来就可以作用xUtils3.0进行快速开发了。

—– 第一部分:注解示例—–

/** * description:xUtils3.0框架注解功能 * 作者:ldm * 时间:20162016/6/22 09:17 * 邮箱:1786911211@qq.com */ @ContentView(R.layout.activity_annotation) public class AnnotationActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); x.view().inject(this); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); TestFragment fragment = new TestFragment(); fragmentTransaction.add(R.id.fra_layout, fragment); fragmentTransaction.commit(); } }

—–注解功能对应地Fragment—–

/** * description:xUtils3.0框架注解之:Fragment中注解使用 * 作者:ldm * 时间:20162016/6/22 09:28 * 邮箱:1786911211@qq.com */ @ContentView(R.layout.frag_test)//给Fragment绑定布局文件 public class TestFragment extends Fragment { @ViewInject(R.id.test_listview) private ListView listView; private List<ListBean> datas; public TestFragment() { super(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return x.view().inject(this, inflater, container);//调用x.view().inject()方法返回view } //onCreateView是创建的时候调用,onViewCreated是在onCreateView后被触发的事件 @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); constructDatas(); listView.setAdapter(new TestAdapter(getActivity(), datas)); } private void constructDatas() { datas = new ArrayList<>(); for (int i = 0; i < 15; i++) { ListBean bean = new ListBean("这是第" + i + "个标题", "这里都是相同的内容"); datas.add(bean); } } //ListView的item点击事件注解操作 @Event(type = AdapterView.OnItemClickListener.class, value = R.id.test_listview) private void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getActivity(), "点击了第" + position + "个item", Toast.LENGTH_LONG).show(); } //长按事件注解操作 @Event(type = AdapterView.OnItemLongClickListener.class, value = R.id.test_listview) private boolean onLongItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getActivity(), "长按第" + position + "个item", Toast.LENGTH_LONG).show(); return true; } }

—–第二部分:图片加载示例—–

/** * description:xUtils3.0框架图片功能 * 作者:ldm * 时间:20162016/6/22 09:17 * 邮箱:1786911211@qq.com */ @ContentView(R.layout.activity_image) public class ImageActivity extends Activity { @ViewInject(R.id.image_01) private ImageView image_01; @ViewInject(R.id.image_02) private ImageView image_02; @ViewInject(R.id.image_03) private ImageView image_03; @ViewInject(R.id.image_04) private ImageView image_04; private String url_01 = ""; private String url_02 = ""; private String url_03 = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); x.view().inject(this);//需要添加这句代码,否则不会关联到布局 } //加载网络图片第一种方法 @Event(value = R.id.image_01) private void loadImageMethodOne(View v) { //直接调用 bind(ImageView view, String url)方法,传入对应控件及url即可 x.image().bind(image_01, url_01); } //加载网络图片第二种方法 @Event(value = R.id.image_02) private void loadImageMethodTwo(View v) { //创建图片参数设置类ImageOptions ImageOptions options = new ImageOptions.Builder().build(); //直接调用bind(ImageView view, String url, ImageOptions options)方法,传入对应参数 x.image().bind(image_02, url_02, options); } //加载网络图片第三种方法 @Event(value = R.id.image_03) private void loadImageMethodThree(View v) { //调用bind(ImageView view, String url, Callback.CommonCallback<Drawable> callback) x.image().bind(image_03, url_03, new Callback.CacheCallback<Drawable>() { @Override public boolean onCache(Drawable result) {//可以在这里设置图片保存等操作 return false; } @Override public void onSuccess(Drawable result) {//获取成功 } @Override public void onError(Throwable ex, boolean isOnCallback) {//获取失败 } @Override public void onCancelled(CancelledException cex) {//取消操作 } @Override public void onFinished() {//完成操作 } }); } //加载本地图片 @Event(value = R.id.image_04) private void loadImageMethodFour(View v) { ImageOptions options = new ImageOptions.Builder(). setImageScaleType(ImageView.ScaleType.FIT_CENTER). setUseMemCache(true). build();//可以设置options各项参数 // assets下的图片 // x.image().bind(image_04, "assets://test.png", options); // SD卡下图片 // x.image().bind(image_04, new File("/sdcard/test.png").toURI().toString(), options); x.image().bind(image_04, "/sdcard/test.gif", options); } }

—–第三部分:HTTP请求—–

/** * description:xUtils框架之Http请求 * 作者:ldm * 时间:20162016/6/22 09:17 * 邮箱:1786911211@qq.com */ @ContentView(R.layout.activity_http) public class HttpActivity extends Activity { @ViewInject(R.id.get) private Button get; @ViewInject(R.id.post) private Button post; @ViewInject(R.id.upload) private Button upLoad; @ViewInject(R.id.download) private Button downLoad; private static final String TAG = "HttpActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); x.view().inject(this); } //HTTP请求之GET请求 @Event(type = View.OnClickListener.class, value = R.id.get) private void httpGetOnClick(View v) { String url = "http://www.baidu.com"; final ProgressDialog dia = new ProgressDialog(this); dia.setMessage("加载中...."); dia.show(); RequestParams params = new RequestParams(url); x.http().get(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { //加载成功回调,返回获取到的数据 Log.i(TAG, "onSuccess: " + result); } @Override public void onFinished() { dia.dismiss();//加载完成 } @Override public void onCancelled(CancelledException cex) { } @Override public void onError(Throwable ex, boolean isOnCallback) { } }); } //HTTP请求之POST请求 @Event(type = View.OnClickListener.class, value = R.id.post) private void httpPostOnClick(View v) { String url = "this is request url for post"; final ProgressDialog dia = new ProgressDialog(this); dia.setMessage("加载中...."); dia.show(); RequestParams params = new RequestParams(url); params.addParameter("userName", "admin");//添加Post请求参数,如果是get请求,会直接添加到url后面 params.addBodyParameter("passWord", "123456"); params.addHeader("head", "给Head添加信息");//addHeader添加Head信息 x.http().post(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { //加载成功回调,返回获取到的数据 Log.i(TAG, "onSuccess: " + result); } @Override public void onFinished() { dia.dismiss();//加载完成 } @Override public void onCancelled(CancelledException cex) { } @Override public void onError(Throwable ex, boolean isOnCallback) { } }); } //HTTP请求之文件上传 @Event(type = View.OnClickListener.class, value = R.id.upload) private void upLoadOnClick(View v) { String upUrl = "/mnt/sdcard/pic/test.jpg";//指定要上传的文件 final ProgressDialog dia = new ProgressDialog(this); dia.setMessage("加载中...."); dia.show(); RequestParams params = new RequestParams(upUrl); params.addBodyParameter("file", new File(upUrl)); x.http().post(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { //加载成功回调,返回获取到的数据 Log.i(TAG, "onSuccess: " + result); } @Override public void onFinished() { dia.dismiss();//加载完成 } @Override public void onCancelled(CancelledException cex) { } @Override public void onError(Throwable ex, boolean isOnCallback) { } }); } //HTTP请求之文件下载 @Event(type = View.OnClickListener.class, value = R.id.download) private void downLoadOnClick(View v) { String downUrl = "please input download url"; final ProgressDialog dia = new ProgressDialog(this); dia.setMessage("加载中...."); dia.show(); RequestParams params = new RequestParams(downUrl); x.http().post(params, new Callback.CommonCallback<File>() { @Override public void onSuccess(File result) { //下载成功 Intent in = new Intent(Intent.ACTION_VIEW); in.setDataAndType(Uri.fromFile(result), "application/vnd.android.package-archive");//比如我们下载的apk文件,直接安装 startActivity(in); } @Override public void onFinished() { dia.dismiss(); } @Override public void onCancelled(CancelledException cex) { } @Override public void onError(Throwable ex, boolean isOnCallback) { } }); } }

—-第四部分:数据库操作——

/** * description:xUtils3.0框架数据库操作 * 作者:ldm * 时间:20162016/6/22 09:17 * 邮箱:1786911211@qq.com */ @ContentView(R.layout.activity_db) public class DatabaseActivity extends Activity { @ViewInject(R.id.create) private Button create; @ViewInject(R.id.add) private Button add; @ViewInject(R.id.delete) private Button delete; @ViewInject(R.id.query) private Button query; @ViewInject(R.id.update) private Button update; @ViewInject(R.id.del_db) private Button del_db; private DbManager.DaoConfig daoConfig; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); x.view().inject(this); } private void initDataBase() { daoConfig = new DbManager.DaoConfig() .setDbName("test.db")//数据库名称 // 不设置dbDir时, 默认存储在app的私有目录. .setDbDir(new File("/sdcard")) // "sdcard"的写法并非最佳实践, 这里为了简单, 先这样写了. .setDbVersion(2)//设置版本号 .setDbOpenListener(new DbManager.DbOpenListener() { @Override public void onDbOpened(DbManager db) { // 开启WAL, 对写入加速提升巨大 db.getDatabase().enableWriteAheadLogging(); } }) .setDbUpgradeListener(new DbManager.DbUpgradeListener() {//数据库升级 @Override public void onUpgrade(DbManager db, int oldVersion, int newVersion) { // TODO: ... // db.addColumn(...); // db.dropTable(...); // ... // or // db.dropDb(); } }); } //创建数据库及表格 @Event(value = R.id.create) private void createOnClick(View v) throws Exception { initDataBase(); DbManager db = x.getDb(daoConfig); Teacher t = new Teacher("张三", 28, "English", 1); db.save(t);//调用这句话,则可以创建表格,并把数据存入 } //添加数据 @Event(value = R.id.add) private void addOnClick(View v) throws Exception { DbManager db = x.getDb(daoConfig); Teacher t = new Teacher("李四", 38, "Math", 3); db.save(t);//如果表格存在,并把数据存入 List<Teacher> list = new ArrayList<>(); list.add(new Teacher("王五", 30, "Engilsh", 2)); list.add(new Teacher("赵六", 40, "Chinese", 3)); list.add(new Teacher("陈七", 50, "Math", 4)); db.save(list);//可以这样保存多条数据到指定表格 } //删除数据 @Event(value = R.id.delete) private void deleteOnClick(View v) throws Exception { DbManager db = x.getDb(daoConfig); WhereBuilder wb = WhereBuilder.b(); wb.and("level", "=", 1); db.delete(Teacher.class, wb);//删除等级为1的教师 } //修改数据 @Event(value = R.id.update) private void updateOnClick(View v) throws Exception { DbManager db = x.getDb(daoConfig); db.update(Teacher.class, WhereBuilder.b().and("name", "=", "王五"), new KeyValue("name", "朱八"));//把王五的名字改成朱八 } //查询数据 @Event(value = R.id.query) private void queryOnClick(View v) throws Exception { DbManager db = x.getDb(daoConfig); WhereBuilder wb = WhereBuilder.b(); wb.and("level", "=", 2); List<Teacher> list = db.selector(Teacher.class).findAll();//查询所有数据 List<Teacher> list1 = db.selector(Teacher.class).where(wb).findAll();//查询等级数2的教师 } //删除数据库或表格 @Event(value = R.id.del_db) private void delDBOnClick(View v) throws Exception { DbManager db = x.getDb(daoConfig); db.dropDb();//删除数据库 db.dropTable(Teacher.class);//删除teacher表格 } }

由于时间关系,代码写得比较粗糙,后期使用中再细化。

Demo下载地址:http://xiazai.jb51.net/201611/yuanma/XutilsDemo(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-11 06:46:49

xUtils3.0框架学习笔记分享的相关文章

CI框架学习笔记(二) -入口文件index.php_php实例

上一节(CI框架学习笔记(一) - 环境安装.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1. 设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中,对设定的环

Bootstrap教程JS插件滚动监听学习笔记分享_javascript技巧

本文主要来学习一下JavaScript插件--滚动监听. 1.案例 滚动监听插件可以根据滚动条的位置自动更新所对应的导航标记.你可以试试滚动这个页面,看看左侧导航的变化. 先把实现的代码上了,你可以通过测试代码先来看看效果. <!DOCTYPE html> <html> <head> <title>Bootstrap</title> <meta name="viewport" content="width=de

CI框架学习笔记(一) - 环境安装、基本术语和框架流程_php实例

最开始使用CI框架的时候,就打算写一个CI源码阅读的笔记系列,可惜虎头蛇尾,一直没有行动.最近项目少,总算是有了一些时间去写一些东西.于是准备将之前的一些笔记和经验记录下来,一方面权作备忘,另一方面时刻提醒自己:借鉴和学习才有出路,忘记过去意味着背叛!基本术语说明 在本文开始之前,有必要对文中反复出现的术语做一个简单的说明,如果你对这一部分已经熟谙,完全可以略过.本文中反复出现和提及的术语包括: 前端控制器(Front Controller): 用于集中控制用户的所有请求的组件,将用户的请求发送

Android自定义控件之开关按钮学习笔记分享_Android

今天来讲讲自定义单个控件,就拿开关按钮来讲讲,相信大家见了非常多这样的了,先看看效果: 我们可以看到一个很常见的开关按钮,那就来分析分析. 首先: 这是由两张图片构成: ①一张为有开和关的背景图片 ②一张为控制开和关的滑动按钮 第一步: 写个类继承View,并重写几个方法: 第一个为构造函数,重写一个参数的函数和两个参数的函数就够了,因为两个参数的函数能够使用自定义属性 第二个为控制控件的大小–>protected void onMeasure(int widthMeasureSpec, int

Symfony2框架学习笔记之表单用法详解_php实例

本文实例讲述了Symfony2框架表单用法.分享给大家供大家参考,具体如下: 对于一个Web开发者来说,处理HTML表单是一个最为普通又具挑战的任务.Symfony2集成了一个Form组件,让处理表单变的容易起来.在这一节里,我们将 从基础开始创建一个复杂的表单,学习表单类库中最重要的内容. Symfony2 的Form组件是一个独立的类库,你可以在Symfony2项目之外使用它. 创建一个简单的表单: 假设你要创建一个应用程序的todo列表,需要显示一些任务.因为你的用户需要编辑和创建任务,所

PHP框架CodeIgniter框架学习笔记

CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而"优雅"的工具包,它可以为 PHP 程序员建立功能完善的 Web 应用程序.如果你是一个使用共享主机,并且为客户所要求的期限而烦恼的开发人员,如果你已经厌倦了那些傻大笨粗的框架 那么 CodeIgniter 就是你所需要的,如果- 你想要一个小巧的框架. 你需要出色的性能. 你需要广泛兼容标准主机上的各种 PHP 版本和配置. 你想要一个几乎只需 0 配置的框架. 你想要一个不需使用命令行的框架. 你想要一个不

Symfony2框架学习笔记之HTTP Cache用法详解_php实例

本文实例讲述了Symfony2框架HTTP Cache用法.分享给大家供大家参考,具体如下: 富web应用程序的本质意味着它们的动态.无论你的应用程序多么有效率,每个请求比起静态文件来说总会存在很多的耗费.对于大多数web程序来说,这没什么. Symfony2非常的轻快,无论你做些严重超载的请求,每个请求将会得到很快的回复,而不会对你的服务器造成压力.但是随着你站点的成长,负载将成为一个严重的问题.对每个请求处理应该只被正常执行一次.这就是缓存真正要达成的目标. 站在巨人肩膀上的缓存: 提高一个

Android自定义控件之开关按钮学习笔记分享

今天来讲讲自定义单个控件,就拿开关按钮来讲讲,相信大家见了非常多这样的了,先看看效果: 我们可以看到一个很常见的开关按钮,那就来分析分析. 首先: 这是由两张图片构成: ①一张为有开和关的背景图片 ②一张为控制开和关的滑动按钮 第一步: 写个类继承View,并重写几个方法: 第一个为构造函数,重写一个参数的函数和两个参数的函数就够了,因为两个参数的函数能够使用自定义属性 第二个为控制控件的大小–>protected void onMeasure(int widthMeasureSpec, int

Ajax 框架学习笔记_AJAX相关

一.XMLHttpRequest 对象的三个重要的属性. onreadystatechange 属性 onreadystatechange 属性存有处理服务器响应的函数.下面的代码定义一个空的函数,可同时对 onreadystatechange 属性进行设置: xmlHttp.onreadystatechange=function() {   // 我们需要在这里写一些代码   } readyState 属性 readyState 属性存有服务器响应的状态信息.每当 readyState 改变时