说实话,对于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. ExecutorService - 10个技巧和窍门

    ExecutorService已经成为Java并发编程中常用的基础库,几乎所有到线程 任务等执行都要委托ExecutorService.下面是使用过程中10个技巧和窍门. 1.为线程池和线程取名 当我 ...

  2. Codeforces Round #366 (Div. 2) B

    Description Peter Parker wants to play a game with Dr. Octopus. The game is about cycles. Cycle is a ...

  3. android sdk 国内镜像地址

    启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - Settings』窗口: 在『Andro ...

  4. 【Regular Expression】常用的正则表达式

    一套完善的应用程序,需要能验证用户输入的信息,从而提醒/引导用户正确地输入信息. 而验证方面,以验证所在的地方分类,可分为: 客户端验证.如果是WEB,一般由Javascript完成,主要用户引导用户 ...

  5. 使用Windows安装的最高版本IE内核加载内嵌页(转载)

    客户端程序内嵌Webbrowser控件时,默认情况都是使用IE7兼容模式打开网页的.但是IE7有很多新的特性不支持,导致无法正常显示出来,所以需要强制使用高版本的IE内核来加载.渲染. void Ch ...

  6. Duilib中系统消息在自己窗口类的使用

    这些Win32消息响应函数,子类只需要重写,不需要在HandleMessage里面再调用一次 开发中遇到的问题,在任务栏关闭程序,会响应WM_SYSCOMMAND消息,因为要给用户提示是否关闭,所以需 ...

  7. php5.3之前版本升级至5.3以及更高版本后部分语法简单归纳

    1. Deprecated: Assigning the return value of new by reference is deprecated in /usr/local/www/uugui/ ...

  8. POJ 3320 Jessica's Reading Problem 尺取法

    Description Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The fina ...

  9. drawRect导致内存暴增的真正原因

    那么现在我们分析一下drawRect导致内存暴增的真正原因: 重写drawRect为何会导致内存大量上涨? 要想搞明白这个问题,我们需要撸一撸在 iOS 程序上图形显示的原理.在 iOS 系统中所有显 ...

  10. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解

    Core data 是 Cocoa 中处理数据,绑定数据的关键特性,其重要性不言而喻,但也比较复杂.Core Data 相关的类比较多,初学者往往不太容易弄懂.计划用三个教程来讲解这一部分: 框架详解 ...