热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

xUtils3.0框架学习笔记分享

这篇文章主要为大家分享了xUtils3.0框架学习笔记,xUtils开源框架的功能介绍,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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中添加对应权限:



第三步:在项目中自定义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 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<&#63;> 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<&#63;> 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 callback)
 x.image().bind(image_03, url_03, new Callback.CacheCallback() {
 @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() {
 @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() {
 @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() {
 @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() {
 @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 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 list = db.selector(Teacher.class).findAll();//查询所有数据
 List 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

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


推荐阅读
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
author-avatar
捕鱼达人2502931267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有