Android xUtils3完全解析 是时候来了解xUtils3了

smartbetter · · 341 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/51866792

xUtils3 是目前功能比较完善的一个Android开源框架。xUtils3 包含了 orm、http(s)、image、view 注解,但依然很轻量级 (246K),并且特性强大,方便扩展:

  • 稳定的基石:AbsTask 和统一的回调接口 Callback,任何异常,即使你的回调方法实现有异常都会进入 onError,任何情况下 onFinished 总会让你知道任务结束了;
  • 基于高效稳定的 orm 工具,http 模块得以更方便的实现 cookie (支持domain、path、expiry 等特性) 和缓存 (支持 Cache-Control、Last-Modified、ETag 等特性) 的支持;
  • 有了强大的 http 及其下载缓存的支持,image 模块的实现相当的简洁,并且支持回收被 view 持有,但被 Mem Cache 移除的图片,减少页面回退时的闪烁;
  • view 注解模块仅仅 400 多行代码却灵活的支持了各种 View 注入和事件绑定,包括拥有多了方法的 listener 的支持。

其他特性:

  • 支持超大文件 (超过2G) 上传;
  • 更全面的 http 请求协议支持 (11种谓词);
  • 拥有更加灵活的 ORM,和 greenDao 一致的性能;
  • 更多的事件注解支持且不受混淆影响;
  • 图片绑定支持 gif (受系统兼容性影响,部分 gif 文件只能静态显示),webp;支持圆角、圆形、方形等裁剪,支持自动旋转;
  • 从 3.5.0 开始不再包含 libwebpbackport.so,需要在 Android4.2 以下设备兼容 webp 的请使用 3.4.0 版本。

xUtils3 的配置十分的简单,使用 Gradle 构建时添加一下依赖即可:

compile 'org.xutils:xutils:3.5.0'

下面看一下使用前的配置,需要加入权限:

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

在 Application 的 onCreate 中初始化:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);
        x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能
    }
}

在 AndroidManifest.xml 文件中注册 Application:

<application
    android:name=".MyApplication"
    ...
</application>

xUtils3主要包含注解模块、网络模块、图片模块和数据库模块,下面将做一一说明。

1.xUtils3注解模块的使用

1.Activity的注解的使用

@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
    @ViewInject(R.id.viewpager)
    private ViewPager viewPager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        x.view().inject(this); //使用注解模块一定要注意初始化视图注解框架
    }
}

2.Fragment的注解的使用

@ContentView(R.layout.fragment_main)
public class MainFragment extends Fragment {
    private boolean injected = false;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        injected = true;
        return x.view().inject(this, inflater, container); //使用注解模块一定要注意初始化视图注解框架
    }
    @Override
    public void onViewCreated(View v, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(v, savedInstanceState);
        if (!injected) {
            x.view().inject(this, this.getView());
        }
    }
}

3.为按钮设置点击事件

/**
 * 1. 方法必须私有限定,
 * 2. 方法参数形式必须和type对应的Listener接口一致.
 * 3. 注解参数value支持数组: value={id1, id2, id3}
 * 4. 其它参数说明见{@link org.xutils.event.annotation.Event}类的说明.
 *    长按事件 type = View.OnLongClickListener.class
 **/
@Event(value = R.id.bt_main,
        type = View.OnClickListener.class/*可选参数, 默认是View.OnClickListener.class*/)
private void onMainButtonClick(View view) {
}

2.xUtils3网络模块的使用

1.GET/POST请求

RequestParams params = new RequestParams(url);
params.setSslSocketFactory(...); // 设置ssl
params.addQueryStringParameter("id","1");
x.http().get(params, new Callback.CommonCallback<String>() {
    //请求成功的回调方法
    @Override
    public void onSuccess(String result) {
    }
    //请求异常后的回调方法
    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
    }
    //主动调用取消请求的回调方法
    @Override
    public void onCancelled(CancelledException cex) {
    }
    @Override
    public void onFinished() {
    }
});

带有缓存的GET请求:

RequestParams params = new RequestParams(url);
params.addQueryStringParameter("username","abc");
params.addQueryStringParameter("password","123");
// 默认缓存存活时间, 单位:毫秒(如果服务器没有返回有效的max-age或Expires则参考)
params.setCacheMaxAge(1000 * 60);

x.http().get(params, new Callback.CacheCallback<String>() {
    private boolean hasError = false;
    private String result = null;
    @Override
    public boolean onCache(String result) {
        // 得到缓存数据, 缓存过期后不会进入这个方法.
        // 如果服务端没有返回过期时间, 参考params.setCacheMaxAge(maxAge)方法.
        //
        // * 客户端会根据服务端返回的 header 中 max-age 或 expires 来确定本地缓存是否给 onCache 方法.
        //   如果服务端没有返回 max-age 或 expires, 那么缓存将一直保存, 除非这里自己定义了返回false的
        //   逻辑, 那么xUtils将请求新数据, 来覆盖它.
        //
        // * 如果信任该缓存返回 true, 将不再请求网络;
        //   返回 false 继续请求网络, 但会在请求头中加上ETag, Last-Modified等信息,
        //   如果服务端返回304, 则表示数据没有更新, 不继续加载数据.
        //
        this.result = result;
        return true; //true: 信任缓存数据, 不再发起网络请求; false不信任缓存数据
    }
    @Override
    public void onSuccess(String result) {
        //如果服务返回304或onCache选择了信任缓存,这时result为null
        if (result != null) {
            this.result = result;
        }
    }
    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
        hasError = true;
        Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
        if (ex instanceof HttpException) { //网络错误
            HttpException httpEx = (HttpException) ex;
            int responseCode = httpEx.getCode();
            String responseMsg = httpEx.getMessage();
            String errorResult = httpEx.getResult();
            //...
        } else { //其他错误
            //...
        }
    }
    @Override
    public void onCancelled(CancelledException cex) {
    }
    @Override
    public void onFinished() {
        if (!hasError && result != null) {
            //成功获取数据
            Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show();
        }
    }
});

POST请求方式类似,这里就不再赘述。

2.其他网络请求方式

RequestParams params = new RequestParams(url);
params.addParameter("id","1");
x.http().request(HttpMethod.PUT, params, new Callback.CommonCallback<String>() {
    @Override
    public void onSuccess(String result) {
    }
    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
    }
    @Override
    public void onCancelled(CancelledException cex) {
    }
    @Override
    public void onFinished() {
    }
});

3.上传文件

String path="/mnt/sdcard/Download/icon.jpg";
RequestParams params = new RequestParams(url);
params.setMultipart(true);
params.addBodyParameter("file",new File(path));
x.http().post(params, new Callback.CommonCallback<String>() {
    @Override
    public void onSuccess(String result) {
    }
    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
    }
    @Override
    public void onCancelled(CancelledException cex) {
    }
    @Override
    public void onFinished() {
    }
});

4.下载文件

url = "http://127.0.0.1/server/abc.apk";
RequestParams params = new RequestParams(url);
//自定义保存路径,Environment.getExternalStorageDirectory():SD卡的根目录
params.setSaveFilePath(Environment.getExternalStorageDirectory()+"/example/");
//自动为文件命名
params.setAutoRename(true);
x.http().post(params, new Callback.ProgressCallback<File>() {
    @Override
    public void onSuccess(File result) {
        //apk下载完成后,调用系统的安装方法
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(result), "application/vnd.android.package-archive");
        getActivity().startActivity(intent);
    }
    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
    }
    @Override
    public void onCancelled(CancelledException cex) {
    }
    @Override
    public void onFinished() {
    }
    //网络请求之前回调
    @Override
    public void onWaiting() {
    }
    //网络请求开始的时候回调
    @Override
    public void onStarted() {
    }
    //下载的时候不断回调的方法
    @Override
    public void onLoading(long total, long current, boolean isDownloading) {
        //当前进度和文件总大小
        Log.i("JAVA","current:"+ current +",total:"+total); 
    }
});

3.xUtils3图片模块的使用

1.ImageOptions

//通过ImageOptions.Builder().set方法设置图片的属性
ImageOptions imageOptions= new ImageOptions.Builder().setFadeIn(true).build(); //淡入效果
//ImageOptions.Builder()的一些其他属性:
.setCircular(true) //设置图片显示为圆形
.setSquare(true) //设置图片显示为正方形
.setCrop(true).setSize(200,200) //设置大小
.setAnimation(animation) //设置动画
.setFailureDrawable(Drawable failureDrawable) //设置加载失败的动画
.setFailureDrawableId(int failureDrawable) //以资源id设置加载失败的动画
.setLoadingDrawable(Drawable loadingDrawable) //设置加载中的动画
.setLoadingDrawableId(int loadingDrawable) //以资源id设置加载中的动画
.setIgnoreGif(false) //忽略Gif图片
.setParamsBuilder(ParamsBuilder paramsBuilder) //在网络请求中添加一些参数
.setRaduis(int raduis) //设置拐角弧度
.setUseMemCache(true) //设置使用MemCache,默认true

2.绑定图片

// assets file
x.image().bind(imageView, "assets://test.gif", imageOptions);

// local file
x.image().bind(imageView, new File("/sdcard/test.gif").toURI().toString(), imageOptions);
x.image().bind(imageView, "/sdcard/test.gif", imageOptions);
x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions);
x.image().bind(imageView, "file:/sdcard/test.gif", imageOptions);

x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
// 用来获取缓存文件
// 当我们通过bind()或者loadDrawable()方法加载了一张图片后,它会保存到本地文件中,那当我需要这张图片时,就可以通过loadFile()方法进行查找
x.image().loadFile(url,imageOptions,new Callback.CacheCallback<File>(){
    @Override
    public boolean onCache(File result) {
        //在这里可以做图片另存为等操作
        Log.i("JAVA","file:"+result.getPath()+result.getName());
        return true; //相信本地缓存返回true
    }
    ...
});

4.xUtils3数据库模块的使用

1.初始化配置和创建实体类

首先在项目 Application 中进行初始化配置 DaoConfig(与onCreate方法同级):

DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
        .setDbName("myapp.db") //设置数据库名,默认xutils.db
        .setDbDir(new File("/mnt/sdcard/")) //设置数据库路径,默认存储在app的私有目录
        .setDbVersion(2) //设置数据库的版本号
        .setDbOpenListener(new DbManager.DbOpenListener() { //设置数据库打开的监听
            @Override
            public void onDbOpened(DbManager db) {
                //开启数据库支持多线程操作,提升性能,对写入加速提升巨大
                db.getDatabase().enableWriteAheadLogging();
            }
        })
        .setDbUpgradeListener(new DbManager.DbUpgradeListener() { //设置数据库更新的监听
            @Override
            public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
            }
        })
        .setTableCreateListener(new DbManager.TableCreateListener() { //设置表创建的监听
            @Override
            public void onTableCreated(DbManager db, TableEntity<?> table){
                Log.i("JAVA", "onTableCreated:" + table.getName());
            }
        });
        //.setAllowTransaction(true) //设置是否允许事务,默认true
DbManager db = x.getDb(daoConfig);

然后创建数据库表 ChildInfo 的实体类:

@Table(name = "child_info",onCreated = "") //onCreated = "sql":当第一次创建表需要插入数据时候在此写sql语句
public class ChildInfo {
    //name:数据库表中的一个字段; isId:是否是主键; autoGen:是否自动增长; property:添加约束
    @Column(name = "id",isId = true,autoGen = true,property = "NOT NULL")
    private int id;
    @Column(name = "c_name")
    private String cName;
    //默认的构造方法必须写出,如果没有,这张表是创建不成功的
    public ChildInfo() {
    }
    public ChildInfo(String cName) {
        this.cName = cName;
    }
    //省略 getter、setter 方法
}

到此就能进行创建和删除数据库的操作了:

2.数据库基本操作

创建数据库:

ArrayList<ChildInfo> childInfos = new ArrayList<>(); //用集合向child_info表中插入多条数据
childInfos.add(new ChildInfo("zhangsan"));
childInfos.add(new ChildInfo("lisi"));
db.save(childInfos); //不仅可以插入单个对象,还能插入集合

删除数据库:

db.dropDb();

删除表:

db.dropTable(ChildInfo.class);

新增表中的数据:

ChildInfo childInfo = new ChildInfo("zhangsan123");
db.save(childInfo);

删除表中的数:

//第一种写法:
db.delete(ChildInfo.class); //child_info表中数据将被全部删除

//第二种写法,添加删除条件:
WhereBuilder b = WhereBuilder.b();
b.and("id",">",2); //构造修改的条件
b.and("id","<",4);
db.delete(ChildInfo.class, b);

修改表中的数据:

//第一种写法:
ChildInfo first = db.findFirst(ChildInfo.class);
first.setcName("zhansan2");
db.update(first,"c_name"); //c_name:表中的字段名

//第二种写法:
WhereBuilder b = WhereBuilder.b();
b.and("id","=",first.getId()); //构造修改的条件
KeyValue name = new KeyValue("c_name","zhansan3");
db.update(ChildInfo.class,b,name);

//第三种写法:
first.setcName("zhansan4");
db.saveOrUpdate(first);

查询表中的数据:

//查询数据库表中第一条数据
ChildInfo first = db.findFirst(ChildInfo.class);
Log.i("JAVA",first.toString());
//添加查询条件进行查询
List<ChildInfo> all = db.selector(ChildInfo.class).where("id",">",2).and("id","<",4).findAll();
for(ChildInfo childInfo :all){
    Log.i("JAVA",childInfo.toString());
}

5.异步/同步执行

1.异步执行

x.task().run(new Runnable() {
    @Override
    public void run() {
        //异步代码
    }
});

2.同步执行

x.task().post(new Runnable() { 
    @Override
    public void run() {
        //同步代码
    }
});

本文来自:CSDN博客

感谢作者:smartbetter

查看原文:Android xUtils3完全解析 是时候来了解xUtils3了

341 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet