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

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

1.xUtils中的IOC框架

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

1
2
3
4
5
6
7
public class LYJApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);//Xutils初始化
    }
}

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

android:name=”.LYJApplication”

这样初始化就算完成了。

使用IOC框架的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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加载图片功能

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

1
2
<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“);

也可以设置参数:

1
2
3
4
5
6
7
8
9
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();

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

3.xUtils操作数据库

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

初始化数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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下。这里我们就默认放在应用程序下。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@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中加入如下代码,向数据库添加数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
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中操作获取数据库数据的代码如下:

1
2
3
4
5
6
7
8
9
10
DbManager db = x.getDb(((LYJApplication)getApplicationContext()).getDaoConfig());
try {
    List&lt;LYJPerson&gt; lyjPersons=db.selector(LYJPerson.class).findAll();
    for (int i=0;i&lt;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();
}

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

4.xUtils的网络请求

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

使用格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
RequestParams params = new RequestParams("http://blog.csdn.net/mobile/experts.html");
x.http().get(params, new Callback.CommonCallback&lt;String&gt;() {
    @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 &lt; 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网络功能还是很强大的。

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

http://download.csdn.net/detail/liyuanjinglyj/9379103

5.导入xUtils工程到Android Studio

下载地址如下:

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

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

㈡添加到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了。

xUtils更新到3.0后的基本使用规则的更多相关文章

  1. android studio从1.5更新到2.0后terminal无法运行gradle命令,提示无法找到gradle命令

    android studio从1.5更新到2.0后terminal无法运行gradle命令,提示无法找到gradle命令. 'gradle' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 设 ...

  2. 更新到.netcore3.0后找不到dotnet-ef的解决办法

    在项目根目录下建立global.json文件 { "sdk": { "version": "2.2.402" } } 或使用命令 dotne ...

  3. Android studio 升级,不用下载完整版,完美更新到2.0

    Android studio 2.0 公布已有一旦时间,据说,速度大大提高了.但是一直没有尝试更新,看到大家相继更新,所以迫不及待就准备更新,但是.更新之路确实异常坎坷.询问度娘,千奇百怪的问题接憧而 ...

  4. 为什么FFT时域补0后,经FFT变换就是频域进行内插?

    应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...

  5. 更新Mac OSX XCode后Git 不能使用提示Can't start Git: /usr/bin/git

    更新Mac OSX XCode后Git 不能使用提示Can't start Git: /usr/bin/git 解决办法: 终端运行 sudo xcodebuild -license 同意协议就好了.

  6. ios pod库更新到1.0或1.0.1之正确修改podfile文件

    今天看到cocopods都更新到1.0.1了,之前什么时候更新到的1.0都没发现,刚刚更新一下之后,立马出现了一大堆的错误. 如果没有更新的话,建议不要更新!!!书写麻烦了! 现在记录如何一步一步去除 ...

  7. IIS6(Win2003) 使用.net 4.0 后,默认文档失效解决方案。

    IIS6(Win2003) 使用.net framework 4.0 后,默认文档失效解决方案. 用.net framework 4.0 开发的WEB项目,但放到iis6 中无法使用默认文档,状况如下 ...

  8. xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题)

    xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题) 前两天为了适配 iOS10 的系统 我将xcode 7.3 升级到了 xcode 8.0 但是 ...

  9. 关于Android Studio升级到2.0后和Gradle插件不兼容的问题

    今天升级AS到2.0后,用AS在真机上调试,发现报了如下错误: This version of Android Studio is incompatible with the Gradle Plugi ...

随机推荐

  1. linux中快捷键

    ctrl+c 终止现在的进程 ctrl+d 退出现在的命令行,类似于exit shift+pageup/pagedown 向上或向下翻页

  2. ubuntu配置服务器环境

    今天环境不知道怎么就不能用了.自己新配了一个: 添加源: vi /etc/apt/sources.list 将下面这些源添加进去: deb http://debian.ustc.edu.cn/ubun ...

  3. 3094 寻找sb4

    3094 寻找sb4  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description sb有一天和sml吵架了,她 ...

  4. [bzoj1051] [HAOI2006]受欢迎的牛 (Tarjan+缩点)

    强连通图,缩点 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受 ...

  5. 关于nodejs4.0 npm乱码以及离线全局安装时要注意的问题

    近期nodejs更新的到了4.~版本,融合了io.js,升级了v8引擎,对于之前的操作有些变化,在这里提醒大家注意: 1.npm在install和remove时发生乱码,并报出"runTop ...

  6. centos系统下设置固定IP+dns

    笔者用的linux系统是centos版本的,在次之前linux是空白,今天我在物理机用XSHELL连接虚拟机中的centos时候出现连接失败的情况,我的第一反应就是IP是不是变了?打开虚拟机之后在终端 ...

  7. HDU 5046 Airport(dlx)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:n个城市修建m个机场,使得每个城市到最近进场的最大值最小. 思路:二分+dlx搜索判定. ...

  8. iOS开发学习笔记:基础篇

    iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...

  9. JAVA开发--[二维码名片生成系统]

    上个月学校有个软件创新杯,最近看了网上很火的二维码比较不错.参考了国内国外一些技术文章,发现国外的确实好很多. 用的是QRcode包来实现的,基本常见的功能全部实现了. 因为刚学2个月,部分做得不是很 ...

  10. NSValue

    1.利用NSValue包装自定义的结构体    typedef struct{        int age;        char *name;        double height;    ...