Days38xUtils

xUtils框架
参考自:http://www.android100.org/html/201606/19/243677.html
xUtils 是一个工具类的集合体,其中包含许多实用的Android工具,主要包含四大模块:
1、ViewUtils的模块
2、HttpUtils的模块
3、BitmapUtils的模块
4、DBUtils的模块
现在有两个版本:2.6.14版本和3.3.36版本,使用上会有差别;
(一)ViewUtils模块
三种用途:1、控件注解 2、资源注解 3、控件的回调方法的注解
注意:所有用到的IOC成员变量,使用的时候
在activity中必须写在x.view().inject(this)(低版本的注入导包时要注意,v7包下也有ViewUtils,不要导错,ViewUtils.inject(this);)之后
在fragment中需要在加载视图view之后,(低版本)ViewUtils.inject(this, view)
相当于给activity了使用xUtils的权限,不然程序会崩溃()
a、控件的注解

//   1、 控件的注解,进行UI绑定,无需findViewById()
    @ViewInject(R.id.txtShow)
    private TextView txtShow;

b、资源注解(低版本可用)(要有type指明是什么资源)

//    2、资源的注解(eg:字符串)
//    @ResInject (id = R.string.app_name , type = ResType.String)
//    private String hehe;

c、控件的回调方法的注解
被注解的方法的要求:
1、必须以private修饰
2、返回值类型
当方法的返回值类型为void的时,返回值类型为任意(意思是给我了我并不用)
当方法的返回值类型不是void时,返回值类型必须是被注解的方法的返回值类型(意思是我要的必须给我)
3、参数签名和type的接口要求的参数签名一致(参数签名指:个数、类型、顺序),否则会报非法的参数异常

备注:
1、value为控件的id集合;注解参数支持数组:value={id1,id2}
2、type为事件类型,默认为点击事件;
3、如果type的接口类型提供多个方法,则需要使用method指定方法名
案例代码:

public class ViewInjectActivity extends AppCompatActivity {

//   1、 控件的注解,进行UI绑定,无需findViewById()
    @ViewInject(R.id.txtShow)
    private TextView txtShow;

    @ViewInject(R.id.vpShow)
    private ViewPager vpShow;

//    2、资源的注解(eg:字符串)
//    @ResInject (id = R.string.app_name , type = ResType.String)
//    private String hehe;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_inject);
        /**
         * ViewUtils的使用:
         * 1、控件注解  2、资源注解  3、控件的回调方法的注解
         * 所有用到的IOC成员变量,使用的时候必须写在x.view().inject(this)之后,不然程序会崩溃
         *
         */
        x.view().inject(this);

        setData();

        txtShow.setText("this is demo1");
    }

    private void setData() {
        final List<ImageView> list = new ArrayList<>();
        int[] resId = new int[]{R.drawable.a1,R.drawable.a2,R.drawable.a3};
        for (int i = 0;i<resId.length;i++){
            ImageView iv = new ImageView(this);
            iv.setImageResource(resId[i]);
            list.add(iv);
        }

        vpShow.setAdapter(new PagerAdapter() {
            @Override
            public int getCount() {
                return list.size();
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view ==object;
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                container.addView(list.get(position));
                return list.get(position);
            }

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView(list.get(position));
            }
        });

    }


    /**
     * 3、回调方法的注解
     * 备注:
     * value为控件的id集合;注解参数支持数组:value={id1,id2}
     * type为事件类型,默认为点击事件;
     * 如果type的接口类型提供多个方法,则需要使用method指定方法名
     *
     *
     * 被注解的方法的要求:
     * 1、必须以private修饰
     * 2、返回值类型
     * 当方法的返回值类型为void的时,返回值类型为任意(意思是给我了我并不用)
     * 当方法的返回值类型不是void时,返回值类型必须是被注解的方法的返回值类型(意思是我要的必须给我)
     * 3、参数签名和type的接口要求的参数签名一致(参数签名指:个数、类型、顺序),否则会报非法的参数异常
     */

//  你可以给我但我不用
    @Event(R.id.btnShow)
    private boolean abc(View view){
        txtShow.setText("click one");
        return false;
    }

//    @Event(R.id.btnShow)
//    private void abc(View v){
//        txtShow.setText("click one ..");
//    }

//   我要的必须给我
    @Event(value = R.id.btnShow3,type = View.OnLongClickListener.class)
    private boolean efg(View view){
        txtShow.setText("long click me");
        return false;
    }

//   当type中提供多个方法,用method指定方法名
    @Event(value = R.id.vpShow,type = ViewPager.OnPageChangeListener.class,method = "onPageSelected")
    private void hij(int position){
        txtShow.setText("this is "+(position+1)+"  page");
    }

//    @Event({R.id.btnShow,R.id.btnShow1})
//    private String abc(View v){
//        switch (v.getId()){
//            case R.id.btnShow:
//                txtShow.setText("click one one");
//                break;
//            case R.id.btnShow1:
//                txtShow.setText("click two two");
//                break;
//        }
//        return null;
//    }


}

(二)HttpUtils模块
相比于使用OkHttp,可以简化代码,其实两行代码就可以实现从网络上获取资源
案例代码:

public class HttpUtilsActivity extends AppCompatActivity {

    private Callback.Cancelable mCancelable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_http_utils);
    }

    //注意:需要在application创建时初始化xUtils
    /**
     * xUtils初始化步骤:
     * 1、创建自己的application类,在onCreate方法中执行x.Ext.init(this);代码
     * 2、别忘了在manifest文件里,application标签中添加name属性
     * @param view
     */
    public void get(View view) {
        String url = "http://api.fengniao.com//app_ipad/pic_bbs_list_v2.php?appImei=000000000000000&osType=Android&osVersion=4.1.1&fid=24&page=1";

        RequestParams entity = new RequestParams(url);
//      CommonCallback相当于一直在监听请求的状态        
        mCancelable = x.http().get(entity, new Callback.CommonCallback<String>() {
//            请求成功的回调方法
            @Override
            public void onSuccess(String result) {
                Toast.makeText(HttpUtilsActivity.this,"result:"+result,Toast.LENGTH_LONG).show();
            }

//            请求失败的回调方法
            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                Toast.makeText(HttpUtilsActivity.this, "请求失败的回调方法", Toast.LENGTH_SHORT).show();
            }

//            取消请求的回调方法
            @Override
            public void onCancelled(CancelledException cex) {
                Toast.makeText(HttpUtilsActivity.this, "取消请求的回调方法", Toast.LENGTH_SHORT).show();
            }

//           请求完成的回调方法(不管请求成功与否,均会调用此方法)
            @Override
            public void onFinished() {
                Toast.makeText(HttpUtilsActivity.this, "请求完成的回调方法", Toast.LENGTH_SHORT).show();
            }
        });
    }

    public void post(View view) {
//        与get方法的不同
        /**
         * 1、需要在RequestParams params = new RequestParams(url);之后
         * 增加代码:    params.addBodyParameter("user","admin");    user对应表单中的标签名 ,admin对应服务器端保存的值
         *               params.addBodyParameter("pass","123456");   如上
         * 2、调用的是x.http().post(RequestParams params,CommonCallback<>  callback);
         *
         */

    }
}

(三)BitmapUtils
1、加载Bitmap的时候无需考虑Bitmap加载过程中出现的OOM和Android容器快速滑动时候出现的图片错位等现象;
2、支持加载网络图片和本地图片;
3、内存管理使用LRU算法,更好的管理bitmap内存;
4、可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。
低版本的使用:
1、加载网络图片
BitmapUtils bitmapUtils = new BitmapUtils(this);
bitmapUtils.display(testImageView, “http://bbs.lidroid.com/static/image/common/logo.png“);

2、加载本地图片(路径以/开头, 绝对路径)
BitmapUtils bitmapUtils = new BitmapUtils(this);
bitmapUtils.display(testImageView, “/sdcard/test.jpg”);

3、加载assets中的图片(路径以assets开头)
BitmapUtils bitmapUtils = new BitmapUtils(this);
bitmapUtils.display(testImageView, “assets/img/wallpaper.jpg”);

4、使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片
BitmapUtils bitmapUtils = new BitmapUtils(this);
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));
高版本的使用:
案例代码:

public class ImageActivity extends AppCompatActivity{

    @ViewInject(R.id.iv)
    private ImageView iv;

//    建造者类,可以添加对ImageView显示图片的设置
    private ImageOptions options;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image);

        x.view().inject(this);

        options = new ImageOptions.Builder()
//                设置图片的保存质量
                .setConfig(Bitmap.Config.ARGB_8888)
//                设置图片下载失败时显示的图片(当没有网络时会显示)(当地址错误会XX)
                .setFailureDrawableId(R.drawable.a3)
//                设置正在加载的图片
                .setLoadingDrawableId(R.drawable.a1)
//                设置图片是否是圆形 ;注意:慎用,是对图片的处理,不是直接操作ImageView;
                .setCircular(true)
//                设置图片是否渐入
                .setFadeIn(true)
//                设置是否使用缓存;注意:此处是3g缓存功能;
                .setUseMemCache(true)
//                设置是否忽略gif图片
                .setIgnoreGif(true)
//                .setIgnoreGif(false)
                .build();
    }

    public void click(View view) {
//        String url = "http://ww1.sinaimg.cn/mw690/4b08ac5ejw1f8n24jqt3oj22yo4g0kjs.jpg";
        String url = "http://qq.yh31.com/tp/zjbq/201512052121443594.gif";

//        将要ImageView控件与图片的url和对控件显示图片的一些设置绑定在一起
        x.image().bind(iv,url,options);
    }
//*****************************************************************
//注意:ImageView加载图片过程:最开始会从内存里加载图片,如果找到图片就会直接返回图片,如果没有就会从硬盘缓存里面去取图片,
//如果硬盘缓存还没有就会从网络加载图片;从网络加载图片,会存一份在内存中,同时存一份在外存SDcard中;
//********************************************************************
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值