Android框架之高速开发框架xUtil

做Android开发我们通常是从原生态的開始,就是调用默认那些Android代码来开发我们的应用,可是到了一定程度,我们就想着怎么来高速开发我们的应用。这个时候我们就要着手来研究框架了。

以下介绍一个非常流行的框架xUtil:

xUtils简单介绍

  • xUtils 包括了非常多有用的android工具。
  • xUtils 最初源于Afinal框架,进行了大量重构。使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词)。拥有更加灵活的ORM,很多其它的事件注解支持且不受混淆影响...
  • xUitls最低兼容android 2.2 (api level 8)
  • 眼下xUtils主要有四大模块:
    • DbUtils模块:

      • android中的orm框架,一行代码就能够进行增删改查。
      • 支持事务,默认关闭;
      • 可通过注解自己定义表名,列名。外键,唯一性约束,NOT NULL约束,CHECK约束等(须要混淆的时候请注解表名和列名);
      • 支持绑定外键,保存实体时外键关联实体自己主动保存或更新。
      • 自己主动载入外键关联实体,支持延时载入。
      • 支持链式表达查询。更直观的查询语义,參考以下的介绍或sample中的样例。
    • ViewUtils模块:

      • android中的ioc框架,全然注解方式就能够进行UI。资源和事件绑定。
      • 新的事件绑定方式,使用混淆工具混淆后仍可正常工作。
      • 眼下支持经常使用的20种事件绑定,參见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
    • HttpUtils模块:
      • 支持同步,异步方式的请求;
      • 支持大文件上传,上传大文件不会oom;
      • 支持GET。POST,PUT。MOVE,COPY,DELETE。HEAD,OPTIONS,TRACE,CONNECT请求。
      • 下载支持301/302重定向,支持设置是否依据Content-Disposition重命名下载的文件。
      • 返回文本内容的请求(默认仅仅启用了GET请求)支持缓存。可设置默认过期时间和针对当前请求的过期时间。
    • BitmapUtils模块:
      • 载入bitmap的时候无需考虑bitmap载入过程中出现的oom和android容器高速滑动时候出现的图片错位等现象;
      • 支持载入网络图片和本地图片。
      • 内存管理使用lru算法。更好的管理bitmap内存;
      • 可配置线程载入线程数量。缓存大小。缓存路径。载入显示动画等...

    使用xUtils高速开发框架须要有下面权限:

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

    混淆时注意事项:

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

    DbUtils用法:

    DbUtils db = DbUtils.create(this);
    User user = new User(); //这里须要注意的是User对象必须有id属性,或者有通过@ID注解的属性
    user.setEmail("[email protected]");
    user.setName("wyouflf");
    db.save(user); // 使用saveBindingId保存实体时会为实体的id赋值
    
    ...
    // 查找
    Parent entity = db.findById(Parent.class, parent.getId());
    List<Parent> list = db.findAll(Parent.class);//通过类型查找
    
    Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=","test"));
    
    // IS NULL
    Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=", null));
    // IS NOT NULL
    Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","!=", null));
    
    // WHERE id<54 AND (age>20 OR age<30) ORDER BY id LIMIT pageSize OFFSET pageOffset
    List<Parent> list = db.findAll(Selector.from(Parent.class)
                                       .where("id" ,"<", 54)
                                       .and(WhereBuilder.b("age", ">", 20).or("age", " < ", 30))
                                       .orderBy("id")
                                       .limit(pageSize)
                                       .offset(pageSize * pageIndex));
    
    // op为"in"时,最后一个參数必须是数组或Iterable的实现类(比如List等)
    Parent test = db.findFirst(Selector.from(Parent.class).where("id", "in", new int[]{1, 2, 3}));
    // op为"between"时,最后一个參数必须是数组或Iterable的实现类(比如List等)
    Parent test = db.findFirst(Selector.from(Parent.class).where("id", "between", new String[]{"1", "5"}));
    
    DbModel dbModel = db.findDbModelAll(Selector.from(Parent.class).select("name"));//select("name")仅仅取出name列
    List<DbModel> dbModels = db.findDbModelAll(Selector.from(Parent.class).groupBy("name").select("name", "count(name)"));
    ...
    
    List<DbModel> dbModels = db.findDbModelAll(sql); // 自己定义sql查询
    db.execNonQuery(sql) // 运行自己定义sql
    ...

    ViewUtils用法

    • 全然注解方式就能够进行UI绑定和事件绑定。
    • 无需findViewById和setClickListener等。
    // xUtils的view注解要求必须提供id。以使代码混淆不受影响。
    
    @ViewInject(R.id.textView)
    TextView textView;
    
    //@ViewInject(vale=R.id.textView, parentId=R.id.parentView)
    //TextView textView;
    
    @ResInject(id = R.string.label, type = ResType.String)
    private String label;
    
    // 取消了之前用法名绑定事件的方式,使用id绑定不受混淆影响
    // 支持绑定多个id @OnClick({R.id.id1, R.id.id2, R.id.id3})
    // or @OnClick(value={R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3})
    // 很多其它事件支持參见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
    
    @OnClick(R.id.test_button)
    public void testButtonClick(View v) { // 方法签名必须和接口中的要求一致
        ...
    }
    ...
    //在Activity中注入:
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ViewUtils.inject(this); //注入view和事件
        ...
        textView.setText("some text...");
        ...
    }
    //在Fragment中注入:
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.bitmap_fragment, container, false); // 载入fragment布局
        ViewUtils.inject(this, view); //注入view和事件
        ...
    }
    //在PreferenceFragment中注入:
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ViewUtils.inject(this, getPreferenceScreen()); //注入view和事件
        ...
    }
    // 其它重载
    // inject(View view);
    // inject(Activity activity)
    // inject(PreferenceActivity preferenceActivity)
    // inject(Object handler, View view)
    // inject(Object handler, Activity activity)
    // inject(Object handler, PreferenceGroup preferenceGroup)
    // inject(Object handler, PreferenceActivity preferenceActivity)
    

    HttpUtils用法:

    普通get方法

    HttpUtils http = new HttpUtils();
    http.send(HttpRequest.HttpMethod.GET,
        "http://www.lidroid.com",
        new RequestCallBack<String>(){
            @Override
            public void onLoading(long total, long current, boolean isUploading) {
                testTextView.setText(current + "/" + total);
            }
    
            @Override
            public void onSuccess(ResponseInfo<String> responseInfo) {
                textView.setText(responseInfo.result);
            }
    
            @Override
            public void onStart() {
            }
    
            @Override
            public void onFailure(HttpException error, String msg) {
            }
    });

    使用HttpUtils上传文件 或者 提交数据 到server(post方法)

    RequestParams params = new RequestParams();
    params.addHeader("name", "value");
    params.addQueryStringParameter("name", "value");
    
    // 仅仅包括字符串參数时默认使用BodyParamsEntity。
    // 类似于UrlEncodedFormEntity("application/x-www-form-urlencoded")。
    
    params.addBodyParameter("name", "value");
    
    // 增加文件參数后默认使用MultipartEntity("multipart/form-data"),
    // 如需"multipart/related"。xUtils中提供的MultipartEntity支持设置subType为"related"。
    
    // 使用params.setBodyEntity(httpEntity)可设置很多其它类型的HttpEntity(如:
    // MultipartEntity,BodyParamsEntity,FileUploadEntity,InputStreamUploadEntity,StringEntity)。
    // 比如发送json參数:params.setBodyEntity(new StringEntity(jsonStr,charset));
    params.addBodyParameter("file", new File("path"));
    ...
    
    HttpUtils http = new HttpUtils();
    http.send(HttpRequest.HttpMethod.POST,
        "uploadUrl....",
        params,
        new RequestCallBack<String>() {
    
            @Override
            public void onStart() {
                testTextView.setText("conn...");
            }
    
            @Override
            public void onLoading(long total, long current, boolean isUploading) {
                if (isUploading) {
                    testTextView.setText("upload: " + current + "/" + total);
                } else {
                    testTextView.setText("reply: " + current + "/" + total);
                }
            }
    
            @Override
            public void onSuccess(ResponseInfo<String> responseInfo) {
                testTextView.setText("reply: " + responseInfo.result);
            }
    
            @Override
            public void onFailure(HttpException error, String msg) {
                testTextView.setText(error.getExceptionCode() + ":" + msg);
            }
    });
    

    使用HttpUtils下载文件:

    • 支持断点续传。随时停止下载任务,開始任务
    HttpUtils http = new HttpUtils();
    HttpHandler handler = http.download("http://apache.dataguru.cn/httpcomponents/httpclient/source/httpcomponents-client-4.2.5-src.zip",
        "/sdcard/httpcomponents-client-4.2.5-src.zip",
        true, // 假设目标文件存在。接着未完毕的部分继续下载。
    
    server不支持RANGE时将从新下载。
        true, // 假设从请求返回信息中获取到文件名称,下载完毕后自己主动重命名。
        new RequestCallBack<File>() {
    
            @Override
            public void onStart() {
                testTextView.setText("conn...");
            }
    
            @Override
            public void onLoading(long total, long current, boolean isUploading) {
                testTextView.setText(current + "/" + total);
            }
    
            @Override
            public void onSuccess(ResponseInfo<File> responseInfo) {
                testTextView.setText("downloaded:" + responseInfo.result.getPath());
            }
    
            @Override
            public void onFailure(HttpException error, String msg) {
                testTextView.setText(msg);
            }
    });
    
    ...
    //调用cancel()方法停止下载
    handler.cancel();
    

    BitmapUtils 用法

    BitmapUtils bitmapUtils = new BitmapUtils(this);
    
    // 载入网络图片
    bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");
    
    // 载入本地图片(路径以/开头。 绝对路径)
    bitmapUtils.display(testImageView, "/sdcard/test.jpg");
    
    // 载入assets中的图片(路径以assets开头)
    bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");
    
    // 使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和高速滑动过程中时候暂停载入图片
    listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
    listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));

    输出日志 LogUtils

    // 自己主动加入TAG,格式: className.methodName(L:lineNumber)
    // 可设置全局的LogUtils.allowD = false。LogUtils.allowI = false...,控制是否输出log。
    
    // 自己定义log输出LogUtils.customLogger = new xxxLogger();
    LogUtils.d("wyouflf");
    
  • 实例。BitmapUtils:
public class xUtilsImageLoader {//框架里面设置了缓存和异步操作,不用单独设置线程池和缓存机制(也能够自己定义缓存路径)  

    private BitmapUtils bitmapUtils;
    private Context mContext;  

    public xUtilsImageLoader(Context context) {
        // TODO Auto-generated constructor stub
        this.mContext = context;
        bitmapUtils = new BitmapUtils(mContext);
        bitmapUtils.configDefaultLoadingImage(R.drawable.logo_new);//默认背景图片
        bitmapUtils.configDefaultLoadFailedImage(R.drawable.logo_new);//载入失败图片
        bitmapUtils.configDefaultBitmapConfig(Bitmap.Config.RGB_565);//设置图片压缩类型  

    }
    /**
     *
     * @author sunglasses
     * @category 图片回调函数
     */
    public class CustomBitmapLoadCallBack extends
            DefaultBitmapLoadCallBack<ImageView> {  

        @Override
        public void onLoading(ImageView container, String uri,
                BitmapDisplayConfig config, long total, long current) {
        }  

        @Override
        public void onLoadCompleted(ImageView container, String uri,
                Bitmap bitmap, BitmapDisplayConfig config, BitmapLoadFrom from) {
            // super.onLoadCompleted(container, uri, bitmap, config, from);
            fadeInDisplay(container, bitmap);
        }  

        @Override
        public void onLoadFailed(ImageView container, String uri,
                Drawable drawable) {
            // TODO Auto-generated method stub
        }
    }  

    private static final ColorDrawable TRANSPARENT_DRAWABLE = new ColorDrawable(
            android.R.color.transparent);
    /**
     * @author sunglasses
     * @category 图片载入效果
     * @param imageView
     * @param bitmap
     */
    private void fadeInDisplay(ImageView imageView, Bitmap bitmap) {//眼下流行的渐变效果
        final TransitionDrawable transitionDrawable = new TransitionDrawable(
                new Drawable[] { TRANSPARENT_DRAWABLE,
                        new BitmapDrawable(imageView.getResources(), bitmap) });
        imageView.setImageDrawable(transitionDrawable);
        transitionDrawable.startTransition(500);
    }
    public void display(ImageView container,String url){//外部接口函数
        bitmapUtils.display(container, url,new CustomBitmapLoadCallBack());
    }
}  
  • 实例:HttpGet:
public class xUtilsGet {//自己主动实现异步处理。自己不用处理  

    public void getJson(String url,RequestParams params,final IOAuthCallBack iOAuthCallBack){  

        HttpUtils http = new HttpUtils();
        http.configCurrentHttpCacheExpiry(1000 * 10);//设置超时时间
        http.send(HttpMethod.GET, url, params, new RequestCallBack<String>() {//接口回调  

            @Override
            public void onFailure(HttpException arg0, String arg1) {
                // TODO Auto-generated method stub
            }  

            @Override
            public void onSuccess(ResponseInfo<String> info) {
                // TODO Auto-generated method stub
                iOAuthCallBack.getIOAuthCallBack(info.result);//利用接口回调传输数据
            }
        });
    }
    public void getCataJson(int cityId,IOAuthCallBack iOAuthCallBack) {//外部接口函数
        String url = "http://xxxxxxxxxx";
        RequestParams params = new RequestParams();
        params.addQueryStringParameter("currentCityId", cityId+"");
        getJson(url,params,iOAuthCallBack);
    }
}  
  • 实例:HttpPost(和HttpGet类似):
public class xUtilsPost {//自己主动实现异步处理  

    public void doPost(String url, RequestParams params,
            final IOAuthCallBack iOAuthCallBack) {  

        HttpUtils http = new HttpUtils();
        http.configCurrentHttpCacheExpiry(1000 * 10);
        http.send(HttpMethod.POST, url, params, new RequestCallBack<String>() {  

            @Override
            public void onFailure(HttpException arg0, String arg1) {
                // TODO Auto-generated method stub
            }  

            @Override
            public void onSuccess(ResponseInfo<String> info) {
                // TODO Auto-generated method stub
                iOAuthCallBack.getIOAuthCallBack(info.result);
            }
        });
    }  

    public void doPostLogin(int cityId, IOAuthCallBack iOAuthCallBack) {
        String url = "http://xxxxxxxxxxxx";
        RequestParams params = new RequestParams();
        params.addQueryStringParameter("currentCityId", cityId + "");
        params.addBodyParameter("path", "/apps/postCatch");
        doPost(url, params, iOAuthCallBack);
    }
}
时间: 2024-10-29 19:13:44

Android框架之高速开发框架xUtil的相关文章

Android框架之快速开发框架xUtil

做Android开发我们一般是从原生态的开始,就是调用默认那些Android代码来开发我们的应用,但是到了一定程度,我们就想着怎么来快速开发我们的应用,这个时候我们就要着手来研究框架了.下面介绍一个很流行的框架xUtil: xUtils简介 xUtils 包含了很多实用的android工具. xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls

Android 最火高速开发框架AndroidAnnotations简单介绍

在上一篇Android 最火的高速开发框架androidannotations配置具体解释中介绍了在eclipse中配置androidannotation的步骤,如需配置请參考. 1.目标 androidannotation框架要促进Android应用程序的编写和维护.相信简单的代码有明白的意图是实现这些目标的最佳途径. 当我们都沉浸在开发Android应用程序时,我们经常会想:为什么我们总是须要重复写同样的代码吗?为什么我们的应用越来越难维护呢? context和activity就像是神一样的

Android框架之网络开发框架Volley

1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高. 不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码.于是乎,一些Android

Android 最火的高速开发框架AndroidAnnotations使用具体解释

Android 最火的高速开发框架androidannotations配置具体解释文章中有eclipse配置步骤.Android 最火高速开发框架AndroidAnnotations简介文章中的简介.本篇注重解说AndroidAnnotations中注解方法的使用. @EActivity 演示样例: @EActivity(R.layout.main) public class MyActivity extends Activity { } @fragment 演示样例: @EFragment(R

android mvp高速开发框架介绍(dileber的简单介绍)

今天我为大家介绍一款android mvp框架:dileber(https://github.com/dileber/dileber.git) 官方交流qq群:171443726 我个人qq:297165331--有什么问题也能够咨询-- ss 随着对安卓开发的深入.越来越发现activity类简直无所不能,于是就导致activity里的代码太多,让人感觉很不爽. 近年来開始流行mvp.于是我对其进行了解,学习,參照了一些资料.自己整合了一套高速开发框架. 我将google 开发的volley,

Android 最火快速开发框架androidannotation简介

在上一篇Android 最火的快速开发框架androidannotations配置详解中介绍了在eclipse中配置androidannotation的步骤,如需配置请参考. 1.目标 androidannotation框架要促进Android应用程序的编写和维护.相信简单的代码有明确的意图是实现这些目标的最佳途径. 当我们都沉浸在开发Android应用程序时,我们常常会想:为什么我们总是需要反复写相同的代码吗?为什么我们的应用越来越难维护呢? context和activity就像是神一样的东西

在Kotlin中使用注释处理Android框架 kapt

本教程介绍如何在 Kotlin 中使用依赖于注释处理的流行的 Android 框架和库. 在日常 Android 开发中,流行着数以千计的框架帮助我们提升开发效率. 使用 Kotlin 开发时仍然可以沿用这些框架,而且和使用 Java 同样简单. 本章教程将提供相关示例并重点介绍配置的差异. 教程以 Dagger. Butterknife. Data Binding. Auto-parcel 以及 DBFlow 为例(其它框架配置基本类似). 以上框架均基于注解处理方式工作:通过对代码注解自动生

App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南

面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本.这个框架里的组件是配合 Android 组件生命周期的,所以它能够很好的规避组件生命周期管理的问题.今天我们就来看看这个库的使用. 通用的框架准则 官方建议在架构 App 的时候遵循以下两个准则: 关注分离 其中早期开发 App 最常见的做法是在 Activity 或者 Fragment 中写了大量

Android框架设计模式(四)——Adapter Method

一适配器模式介绍 什么是适配器模式 定义 分类 适配器应用于什么场景 二Android框架中的适配器模式应用 ListViewBaseAdapter自定义View 通俗UML图 关键代码分析 ActivityBinderMediaPlayer 通俗UML图 关键代码分析 三适配器模式与其他模式的配合 适配器观察者模板策略组合 BaseAdapterListView自定义View 整体UML图 模式分析不同的视角决定 适配器观察者模板 Service Activity 自定义服务 整体UML图 模