欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android xUtils更新到3.0后的基本使用规则详解

程序员文章站 2024-03-05 15:31:07
 说实话,对于xutils,是我最近才用到的开发框架(也是刚接触),对于其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发工具,但是其最近更新到3.0也没...

 说实话,对于xutils,是我最近才用到的开发框架(也是刚接触),对于其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发工具,但是其最近更新到3.0也没有解决加载自定义imageview报错的问题。

xutils简介

xutils 包含了很多实用的android工具。

xutils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的orm,更多的事件注解支持且不受混淆影响...

xuitls 最低兼容android 2.2 (api level 8)

我总是喜欢用一些最新的东西,xutils 3.0才刚更新,是一次比较大的重构,对于百度到的使用规则,基本都是3.0以前的,使得用3.0的开发者需要求解用法的时候,遇到许多阻碍,故此在这里简单介绍xutils 3.0的使用规则。关于怎么导入功能,其实并不是本文的内容,不过在此文最后一节简单讲解了一下导入的方式。

1.xutils中的ioc框架

使用xutils的第一步就是必须创建自己的application类,代码如下:

public class lyjapplication extends application {
@override
public void oncreate() {
super.oncreate();
x.ext.init(this);//xutils初始化
}
}

在androidmanifest.xml的application标签中添加如下代码:

复制代码 代码如下:

android:name=".lyjapplication"

这样初始化就算完成了。

使用ioc框架的代码如下:

import org.xutils.view.annotation.contentview;
import org.xutils.view.annotation.event;
import org.xutils.view.annotation.viewinject;
import org.xutils.x;
@contentview(value = r.layout.activity_main)
public class mainactivity extends appcompatactivity {
@viewinject(value = r.id.mybut)
private button mybut;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
x.view().inject(this);
}
@event(value = r.id.mybut,type = view.onclicklistener.class)
private void onbuttonclick(view v){
switch (v.getid()){
case r.id.mybut:
toast.maketext(this,"你好我是xutils的ioc功能",toast.length_short).show();
break;
}
}
}

需要解释的以下几点:

其一:使用ioc必须全部为私有,不然无效,这里就做演示了,不信你可以把用到ioc框架的注解的成员变量及方法全部换成public ,那么全部会无效,当然除了contentview例外。

其二,所有用到ioc成员变量,使用的时候,必须在x.view().inject(this)后,如果写在前面,那么程序会崩溃。

2.xutils加载图片功能

现在我们需要设置两个权限,如下:

<uses-permission android:name="android.permission.internet" />
<uses-permission android:name="android.permission.write_external_storage" />

接下来就是加载网络图片到imageview中:

x.image().bind(image,"http://pic.baike.soso.com/p/20090711/20090711101754-314944703.jpg");

也可以设置参数:

imageoptions imageoptions = new imageoptions.builder()
.setsize(densityutil.dip2px(120), densityutil.dip2px(120))//图片大小
.setradius(densityutil.dip2px(5))//imageview圆角半径
.setcrop(true)// 如果imageview的大小不是定义为wrap_content, 不要crop.
.setimagescaletype(imageview.scaletype.center_crop)
.setloadingdrawableid(r.mipmap.ic_launcher)//加载中默认显示图片
.setfailuredrawableid(r.mipmap.ic_launcher)//加载失败后默认显示图片
.build();
x.image().bind(image, "http://pic.baike.soso.com/p/20090711/20090711101754-314944703.jpg",imageoptions);

你也可以将第2个参数设置为图片文件路径,那么将从sd卡中加载图片。

3.xutils操作数据库

我们都知道,一个app中操作数据库的地方有很多,就像是否登录一样,有些地方必须登录后才能操作,那么肯定是全局变量,所以,必须将数据库的初始化放在application,且必须提供获取数据库的方法,使得在应用程序的任何地方都可以直接获取数据库,并操作数据库,不然重复的获取与释放只能增加内存无谓的消耗。

初始化数据库:

public class lyjapplication extends application {
private dbmanager.daoconfig daoconfig;
public dbmanager.daoconfig getdaoconfig() {
return daoconfig;
}
@override
public void oncreate() {
super.oncreate();
x.ext.init(this);//xutils初始化
daoconfig = new dbmanager.daoconfig()
.setdbname("lyj_db")//创建数据库的名称
.setdbversion(1)//数据库版本号
.setdbupgradelistener(new dbmanager.dbupgradelistener() {
@override
public void onupgrade(dbmanager db, int oldversion, int newversion) {
// todo: ...
// db.addcolumn(...);
// db.droptable(...);
// ...
}
});//数据库更新操作
}
}

上面的注释明了,有必要说明的一点是setdbdir(new file("/sdcard")),可以将数据库存储在你想存储的地方,如果不设置,那么数据库默认存储在/data/data/你的应用程序/database/xxx.db下。这里我们就默认放在应用程序下。

我们首先创建一个实体类,如下:

@table(name="lyj_person")
public class lyjperson {
@column(name = "id", isid = true)
private int id;
@column(name = "name")
private string name;
@column(name = "age")
private string age;
public string getage() {
return age;
}
public void setage(string age) {
this.age = 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;
}
}

通过实体类可以直接操作数据库。

我们在application中加入如下代码,向数据库添加数据:

dbmanager db = x.getdb(daoconfig);
lyjperson person1=new lyjperson();
person1.setname("liyuanjinglyj");
person1.setage("23");
lyjperson person2=new lyjperson();
person2.setname("xutilsdemo");
person2.setage("56");
try {
db.save(person1);
db.save(person2);
} catch (dbexception e) {
e.printstacktrace();
}

在activity中操作获取数据库数据的代码如下:

dbmanager db = x.getdb(((lyjapplication)getapplicationcontext()).getdaoconfig());
try {
list<lyjperson> lyjpersons=db.selector(lyjperson.class).findall();
for (int i=0;i<lyjpersons.size();i++){
log.i("liyuanjinglyj","lyjperson"+i+".name="+lyjpersons.get(i).getname());
log.i("liyuanjinglyj","lyjperson"+i+".name="+lyjpersons.get(i).getage());
}
} catch (dbexception e) {
e.printstacktrace();
}

那么肯定会得到如下结果:

Android xUtils更新到3.0后的基本使用规则详解

4.xutils的网络请求

android规定ui线程是不能涉及网络任务的,所以,这里主要简单介绍xutils的异步网络请求,同步的自行探究。

使用格式如下:

requestparams params = new requestparams("http://blog.csdn.net/mobile/experts.html");
x.http().get(params, new callback.commoncallback<string>() {
@override
public void onsuccess(string result) {
document doc = jsoup.parse(result);
element div = doc.select("div.list_3").get(0);
elements imgs = div.getelementsbytag("img");
for (int i = 0; i < imgs.size(); i++) {
element img = imgs.get(i);
log.i("liyuanjinglyj",img.attr("alt"));
}
}
@override
public void onerror(throwable ex, boolean isoncallback) {
}
@override
public void oncancelled(callback.cancelledexception cex) {
}
@override
public void onfinished() {
}
});

这里获取的是csdn移动博客专家的html页面信息,看看下面的日志,就知道xutils网络功能还是很强大的。

Android xUtils更新到3.0后的基本使用规则详解

本文最后附带了一下粗略模仿csdn app的源码,有意者可以下载看看,里面用到另一个开发框架,我用来专门处理图片的(afinal)。都说xutils是afinal的进化版,不过在图片方面,我们觉得xutils还有点不足。

5..导入xutils工程到android studio

下载地址如下:

https://github.com/wyouflf/xutils3/tree/master

㈠将下载的工程复制到project目录下:

Android xUtils更新到3.0后的基本使用规则详解

㈡添加到settings.gradle文件:

include ':app',':xutils'

㈢编译到工程中

dependencies {
compile filetree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
compile project(':xutils')
}

㈣将xutils文件夹下的build.gradle中的版本与最低版本调整到与创建工程一致

compilesdkversion 23
buildtoolsversion "23.0.1"
defaultconfig {
minsdkversion 15
targetsdkversion 23
versioncode 20151224
versionname version
}

㈤添加如下代码到build.gradle(project:xutilsdemo)中

dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
// note: do not place your application dependencies here; they belong
// in the individual module build.gradle files
}

其中红色标记为添加的代码。

点击sync now就可以使用xutils了。