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

说实话,对于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();

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

你也可以将第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了。

时间: 2024-10-13 21:36:29

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

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

android studio从1.5更新到2.0后terminal无法运行gradle命令,提示无法找到gradle命令. 'gradle' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 设置由于升级后android studio后gradle版本发生了变化,而系统环境变量未做相应的更新导致. 修改系统环境变量:Path,将D:\Android\Android Studio\gradle\gradle-2.8\bin;改为D:\Android\Android Studio\gradle

更新到Xcode7.0后遇到的问题

(1)原本用户登录一点问题没有,但是更新到Xcode7就出现如下的问题: 这是使用AFNetworking访问网络失败的提示信息: Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSUnderlyi

更新到10.11后 cocoapods 重装问题

更新到10.11后 cocoapods 需要重新安装,但是使用原来的淘宝源(http://ruby.taobao.org/) 会报错 ERROR:  Could not find a valid gem 'cocospods’ (>= 0), here is why: Unable to download data from http://ruby.taobao.org/ - bad response Not Found 404 (http://ruby.taobao.org/latest_sp

Android ADT 23.0.0无法更新到23.0.2问题解决方案

android SDK更新到23.0.2后创建新项目无法创建MainActivity和默认布局,这个时候就需要更新ADT到23.0.2 更新时报如下错误 Your original request has been modified. "Android DDMS" is already installed, so an update will be performed instead. "Android Development Tools" is already i

解决Ubuntu更新nVidia显卡驱动后黑屏问题

跟大数据没关系,自己使用的一个记录. 现在已经完全抛弃windows了,完全用ubuntu来干活了.不是windows不好,是中国的windows生态环境太差了,随便装个国产小软件会附带给用户装一堆垃圾的东西,什么各种毒霸,各种手机助手,各种输入法,稍微点错个什么按钮就装一堆的垃圾,到处都是陷阱,就连开源的SourceForge推出的FileZilla安装器,后台还偷偷自动下载Norton 360强制安装.他妈的老外都被中国这帮臭流氓软件公司带坏了.用户还根本没得选择,所以干脆痛下决心,把Win

小米2s升级到miui 39.0后wifi网络不稳定等问题解决

小米2s升级到miui 39.0后,其他貌似没有问题,但是发现wifi不稳定了,很多app都进不去,优酷视频也看不了.怎么破? 网上找了很久,很多人说刷机,这小米尼玛我数据线链接了电脑竟然没有任何提示,各种软件都下遍了,手机助手用wifi连电脑也不行~ 快要放弃的时候,突然发现了一个以前没注意的好地方.就是系统的更新那里,可以按左键(菜单键),出现了一些东西. 选择"重启到Recovery" 然后再选择“重启手机”,然后看到有 “重启进入系统一(最近)” “重启进入系统二”  ,带“最

iOS8.0+后去横竖屏概念

从iOS8.0后苹果重新定义了横竖屏变化的回调函数,开始逐渐废弃UIInterfaceOrientationd,对应的will/didRotatateToInterfaceOrientation:回调函数也开始废弃,对应新加的了两个代理UIContentContainer和UITraintEvironment,UIViewController已经继承了这两个代理,而我们需要实现的方法是willTransitionToTraitCollection: 和 viewWillTransitionToS

web.xml格式(避免eclipse更新延迟-3.0版)

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee htt

《转》vue更新到2.0之后vue-resource不在更新,axios的使用

vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现在说一下它的基本用法. 首先就是引入axios,如果你使用es6,只需要安装axios模块之后 import axios from 'axios';//安装方法npm install axios//或bower install axios 当然也可以用script引入 <script src="https://unpkg.com/axios/dist/axios.min.js&