别再使用单一框架了,XUtils——你值得拥有!

XUtils使用详解

一. XUtils是什么?

简介

xUtils 包含了orm, http(s), image, view注解, 但依然很轻量级(251K), 并且特性强大, 方便扩展.

  1. orm: 高效稳定的orm工具, 使得http接口实现时更方便的支持cookie和缓存.
    灵活的, 类似linq表达式的接口.和greenDao一致的性能.
  2. http(s): 基于UrlConnection, Android4.4以后底层为okHttp实现.
    请求协议支持11种谓词: GET,POST,PUT,PATCH,HEAD,MOVE,COPY,DELETE,OPTIONS,TRACE,CONNECT
    支持超大文件(超过2G)上传
    支持断点下载(如果服务端支持Range参数,客户端自动处理断点下载)
    支持cookie(实现了domain, path, expiry等特性)
    支持缓存(实现了Cache-Control, Last-Modified, ETag等特性, 缓存内容过多时使用过期时间+LRU双重机制清理)
    支持异步和同步(可结合RxJava使用)调用
  3. image: 有了http(s)及其下载缓存的支持, image模块的实现相当的简洁.
    支持内存缓存, 磁盘缓存(缩略图和原图), 并且支持回收被view持有, 但被MemCache移除的图片, 减少页面回退时的闪烁.
    支持在ListView滑动时, 自动停止被回收复用的item对应的下载任务(再次下载时断点续传)
    支持webp, gif(部分比较老的系统只展示静态图)
    支持圆角, 圆形, 方形等裁剪, 支持自动旋转…
  4. view注解: view注解模块仅仅400多行代码却灵活的支持了各种View注入和事件绑定.
    事件注解支持且不受混淆影响…(参考sample的混淆配置)
    支持绑定拥有多个方法的listener

使用前配置

需要的权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 可选 -->
初始化
// 在application的onCreate中初始化
@Override
public void onCreate() {
    super.onCreate();
    x.Ext.init(this);
    x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
    ...
}
AndroidManifest.xml文件application 节点里添加
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"

在使用注解的地方需要绑定

x.view().inject(this);//没有用到view注解可以先不用

二.XUtils加载图片

ImageOption

ImageOption是xutils中的一个类,我们在加载图片时如果对加载的图片做一些处理,比如设置大小和圆角,可以通过ImageOption来进行处理。

private  ImageOptions getImageOptions(){
        ImageOptions imageOptions = new ImageOptions.Builder()
                .setSize(DensityUtil.dip2px(120), DensityUtil.dip2px(120))//设置大小
                .setRadius(DensityUtil.dip2px(30))//设置圆角半径
                .setCrop(true)//如果ImageView的大小不是定义为wrap_content, 不要crop
                .setImageScaleType(ImageView.ScaleType.CENTER_CROP)
                .setLoadingDrawableId(R.drawable.ic_launcher_background)//加载中显示
                .setFailureDrawableId(R.drawable.ic_launcher_foreground)//失败时显示
                .build();
                //建造者设计模式
        return imageOptions;
    }

加载网络图片

1.简单加载

imageOptions = getImageOptions();
x.image().bind(imageView, "https://cdn.xiaoz.me/wp-content/uploads/2018/12/shibie_600.jpg");

2.带有回调的加载

imageOptions = getImageOptions();
                x.image().bind(imageView, "https://img0.utuku.china.com/640x0/news/20200517/734aa0ad-2843-4073-b370-f168fd56bc38.jpg", new Callback.CommonCallback<Drawable>() {
                    @Override
                    public void onSuccess(Drawable result) {
                        showToast("图片加载成功");
                    }

                    @Override
                    public void onError(Throwable ex, boolean isOnCallback) {
                        showToast("网址错误");
                    }

                    @Override
                    public void onCancelled(CancelledException cex) {
                        showToast("图片加载取消");
                    }

                    @Override
                    public void onFinished() {
                        showToast("图片加载结束");
                    }
                });

3.带有缓存回调的图片加载

x.image().bind(imageView, "https://img0.utuku.china.com/640x0/news/20200517/734aa0ad-2843-4073-b370-f168fd56bc38.jpg", new Callback.CacheCallback<Drawable>() {
                    @Override
                    public boolean onCache(Drawable result) {
                        return true;
                    }

                    @Override
                    public void onSuccess(Drawable result) {
                        showToast("图片加载成功");
                    }

                    @Override
                    public void onError(Throwable ex, boolean isOnCallback) {
                        showToast("网址错误");
                    }

                    @Override
                    public void onCancelled(CancelledException cex) {
                        showToast("图片加载取消");
                    }

                    @Override
                    public void onFinished() {
                        showToast("图片加载结束");
                    }
                });

加载Android资源图片

1.加载assert目录下的资源

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

2.加载res/drawable目录下资源

x.image().bind(imageView, "res://"+R.drawable.test);

加载sd卡图片

加载sd卡图片

x.image().bind(imageView, "file:///sdcard/Pictures/pic/photo.png");

三.XUtils请求网络

RequestParams

RequestParam同样是xutils中的一个类,我们可以在构造函数中传入url

RequestParams params = new RequestParams("http://xxxx:8080/user/login");

如果需要携带参数,可以通过下列方式添加

params.addBodyParameter("userAccount", "1001");
   params.addBodyParameter("userPwd", "123456");

get请求

x.http().get(params, new Callback.CacheCallback<String>() {.....})

post请求

同步请求(阻塞主线程,不建议使用)

x.http().postSync(params, String.class);

异步请求

RequestParams params = new RequestParams("http://1xxxx:8080/user/login");
                params.addBodyParameter("userAccount", "1001");
                params.addBodyParameter("userPwd", "123456");
                x.http().post(params, new Callback.CommonCallback<String>() {

                    @Override
                    public void onSuccess(String result) {
                        Log.d("xutils", "success");
                        JSONObject json = JSON.parseObject(result);
                        if(json.getString("res").equals("success")){
                            showToast("登录成功");
                        }else{
                            showToast("登录失败");
                        }
                    }
                    @Override
                    public void onError(Throwable ex, boolean isOnCallback) {
                        showToast("网址错误或者网络不可用");
                    }

                    @Override
                    public void onCancelled(CancelledException cex) {
                        showToast("登录被取消");
                    }

                    @Override
                    public void onFinished() {
                        Log.d("xutils", "finish");
                        showToast("OnFinish最后被回调");
                    }
                });

四.使用总结

个人使用感受:Xutils使用方便,集合了几种框架于一体,至少结合了Okhttp + Glide + ButterKnife+GreenDAO.是一款非常不错的框架,强推。Xutils的源码也写的比较容易看懂,建议大家阅读。

相关阅读:

小投资创业项目

绪川里绪

都丸纱也华

原文地址:https://www.cnblogs.com/hzcya1995/p/13309119.html