Android 开源框架 ( 五 ) xUtils --- Android 里的 ORM IOC聚合型框架

  xUtils同Afinal一样属于聚合型框架, 大而全,但是越容易牵一发而动全身。所以不推荐使用,只做了解即可.应付手头临时项目.

  Android 开源框架 ( 四 ) Afinal --- Android 里的 ORM IOC聚合型框架

一.Xutils 介绍

  Xutils是基于afinal开发的,但是比afinal稳定性提高了不少.xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...
  xUitls最低兼容android 2.2.

  XUtils四大模块: 

DbManager  数据库访问接口
    android中的orm框架,一行代码就可以进行增删改查;     支持事务,默认关闭;     可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);     支持绑定外键,保存实体时外键关联实体自动保存或更新;     自动加载外键关联实体,支持延时加载;     支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。 
ViewInjector view注入接口
        android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
        新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
        目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。        
HttpManager http请求接口
      支持同步,异步方式的请求;
    支持大文件上传,上传大文件不会oom;
    支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求;
    下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
    返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。    
ImageManager 图片绑定接口
      加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
    支持加载网络图片和本地图片;
    内存管理使用lru算法,更好的管理bitmap内存;
    可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等...

  混淆配置:

    1. 添加Android默认混淆配置${sdk.dir}/tools/proguard/proguard-android.txt
    2. 不要混淆xUtils中的注解类型,添加混淆配置:-keep class * extends java.lang.annotation.Annotation { *; }
    3. 对使用DbUtils模块持久化的实体类不要混淆,或者注解所有表和列名称@Table(name="xxx"),@Id(column="xxx"),@Column(column="xxx"),@Foreign(column="xxx",foreign="xxx");

二.Xutils 使用

1.引入示例module

    

2.记得授权

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3.Application里初始化

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);
        x.Ext.setDebug(BuildConfig.DEBUG); // 开启debug会影响性能
    }
}

4.DbManager操作数据库

DbManager.DaoConfig 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();
                }
            });
 DbManager db = x.getDb(daoConfig);        

最终都是调用xutils lib里的db包里的DbModelSelector类转换为sql语句操作sqlLite数据库

        

5.HttpManager请求,ImageManager加载图片

private void loadImgList(String url) {
        //HttpManager异步GET请求
        x.http().get(new RequestParams(url), new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                imageListAdapter.addSrc(getImgSrcList(result));
                imageListAdapter.notifyDataSetChanged();//通知listview更新数据
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });
    }
ImageOptions imageOptions;
    imageOptions = new ImageOptions.Builder()
                .setSize(DensityUtil.dip2px(120), DensityUtil.dip2px(120))
                .setRadius(DensityUtil.dip2px(5))
                // 如果ImageView的大小不是定义为wrap_content, 不要crop.
                .setCrop(true) // 很多时候设置了合适的scaleType也不需要它.
                // 加载中或错误图片的ScaleType
                //.setPlaceholderScaleType(ImageView.ScaleType.MATRIX)
                .setImageScaleType(ImageView.ScaleType.CENTER_CROP)
                .setLoadingDrawableId(R.mipmap.ic_launcher)
                .setFailureDrawableId(R.mipmap.ic_launcher)
                .build();
x.image().bind(iv_big_img, getIntent().getStringExtra("url"), imageOptions);

 

 



posted @ 2018-07-30 23:55  FreeFunCode  阅读(423)  评论(0编辑  收藏  举报