zoukankan      html  css  js  c++  java
  • Android xUtils3.0使用手册(一)- 基础功能使用

    xUtils3 其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发工具,但是苦于没有完整的使用手册,下面是使用中的一些总结,不断完善。

    xUtils 版本 3.3.36
    jar包下载地址

    http://files.cnblogs.com/files/steffen/xUtils-3.3.36.zip

    GitHub项目地址

    https://github.com/wyouflf/xUtils3

    使用前配置

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

    导入文件

    方法1:导入jar包文件;

    方法2:在gradle中添加依赖:

    dependencies {
        compile 'org.xutils:xutils:3.3.44'
    }


     

    1. xUtils中的IOC框架

    使用xUtils的第一步就是先创建自己的Application类,在MyApplication中初始化xUtils,代码如下:

    复制代码
    1 public class MyApplication extends Application {
    2     @Override     
    3     public void onCreate() {
    4         super.onCreate();
    5         x.Ext.init(this); //xUtils初始化     
    6     } 
    7 }
    复制代码

    在AndroidManifest.xml的application标签中添加如下代码:    

    1 android:name=".MyApplication" 

    这样初始化就算完成了。

    例:下面使用IOC框架的代码如下:

    复制代码
     1 import org.xutils.view.annotation.ContentView;
     2 import org.xutils.view.annotation.Event;
     3 import org.xutils.view.annotation.ViewInject;
     4 import org.xutils.x;
     5 // 获取Activity布局
     6 @ContentView(R.layout.activity_main)
     7 public class MainActivity extends Activity {
     8     // 获取控件ID
     9     @ViewInject(R.id.mybut)
    10     private Button mybut;
    11 
    12     @Override
    13     protected void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         x.view().inject(this); // 初始化x.view(), 否则ID获取失败
    16     }
    17 
    18     /** 添加控件监听事件 */
    19     @Event(value = {R.id.mybut, R.id.myradio},type = View.OnClickListener.class)
    20     private void onButtonClick(View v){
    21         switch (v.getId()) {
    22             case R.id.mybut:
    23                 Toast.makeText(this,"我是xUtils的IOC功能", Toast.LENGTH_SHORT).show();
    24                 break;
    25             case R.id.myradio:
    26                 break;
    27         }
    28     }
    29 } 
    复制代码

     注释:监听事件中,@Event, value后面是 Array,当多个ID时{R.id.btn1, R.id.btn2, R.id.btn3, ···}; 当只有一个ID时可直接写 value=R.id.btn。

    当有多个ID时,要保证后面事件的类型(type)要是一致的,否则要在不同的方法中实现。

    另:点击事件方法名一定要包含onClick或者onEven。

    2. 网络请求

    RequestParams 参数:

    RequestParams params = new RequestParams(url);

    .addQueryStringParamter("wd", "xUtils"); // 适用于GET请求方式;类似于字符串拼接 http://xxx/x?wd=xUtils。 

    .addBodyParameter("wd", "xUtils"); // 适用于POST请求方式;添加到Body体的参数。

    2.1 GET/POST请求

        get和post请求并无太大区别,主要区别在于参数的添加方法上。

      GET请求 POST请求
    请求参数添加:   .addQueryStringParamter("wd", "xUtils");   .addBodyParameter("wd", "xUtils");
    请求的方法(带缓冲):   x.http().get(params,  new Callback.CommonCallback<String>() { });      x.http().post(params,  new Callback.CommonCallback<String>() { });   
    请求的方法(带缓冲):   x.http().get(params,  new Callback.CacheCallback<String>() { });      x.http().post(params,  new Callback.CacheCallback<String>() { });   

     

     

     

    2.1.1 无缓存请求(以post为例)

    复制代码
     1 RequestParams params = new RequestParams("http://xxx.com/xx");
     2 x.http().post(params,  new Callback.CommonCallback<String>() { 
     3         @Override
     4         public void onSuccess(String result) {
     5             // 请求成功后,返回结果
     6         }
     7         @Override     
     8         public void onError(Throwable ex, boolean isOnCallback) {
     9             // 请求失败后返回结果
    10             if (!isNetworkConnections() || ex instanceof HttpException) {
    11                 // 网络错误
    12             } else {
    13                 // 其他请求错误
    14         }
    15         @Override     
    16         public void onCancelled(Callback.CancelledException cex) {
    17             // 中断请求
    18         }
    19         @Override     
    20         public void onFinished() {
    21             // 请求结束(必调用)
    22         } 
    23     }
    24 );
    25 /**
    26  * @return 网络是否连接 true:有网络,false:无网络
    27  */
    28 private boolean isNetworkConnections() {
    29     ConnectivityManager con = (ConnectivityManager) x.app().getSystemService(Context.CONNECTIVITY_SERVICE);
    30     boolean wifi = con.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected();
    31     boolean internet = con.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected();
    32     return (wifi || internet);
    33 }
    复制代码

    2.1.2 有缓存请求(以POST为例)

    复制代码
     1 RequestParams params = new RequestParams("http://xxx.com/xx");
     2 x.http().post(params,  new Callback.CacheCallback<String>() { 
     3         @Override
     4         public void onSuccess(String result) {
     5             // 请求成功后,返回结果
     6         }
     7         @Override
     8         public boolean onCache(String result) {
     9             // 此方法为本地加载回调方法,本地没有数据则不会调用此方法
    10             // @param result 缓存中得到的数据
    11             // @return true 如果缓存中有数据就不再进行网络请求
    12             // false 得到缓存数据后仍进行网络请求
    13             return ture;
    14         }
    15         @Override     
    16         public void onError(Throwable ex, boolean isOnCallback) {
    17             // 请求失败后返回结果
    18             if (!isNetworkConnections() || ex instanceof HttpException) {
    19                 // 网络错误
    20             } else {
    21                 // 其他请求错误
    22         }
    23         @Override     
    24         public void onCancelled(Callback.CancelledException cex) {
    25             // 中断请求
    26         }
    27         @Override     
    28         public void onFinished() {
    29             // 请求结束(必调用)
    30         } 
    31     }
    32 );    
    复制代码


     

    3. 图片加载

    3.1 普通图片加载

    最简单的加载方式:

    x.image().bind(image, "http://pic6.nipic.com/20100418/4581549_084724004690_2.jpg");

    当然我们也可以设置一些属性:

    复制代码
    1 ImageOptions imageOptions = new ImageOptions.Builder()
    2                     .setSize(120, 120)
    3                     .setRadius(DensityUtil.dip2px(5))
    4                     .setCrop(true)
    5                     .setImageScaleType(ImageView.ScaleType.CENTER_CROP)
    6                     .setLoadingDrawableId(R.mipmap.ic_launcher)
    7                     .setFailureDrawableId(R.mipmap.ic_launcher)
    8                     .build(); 
    9 x.image().bind(image, "http://pic6.nipic.com/20100418/4581549_084724004690_2.jpg",imageOptions);
    复制代码

    3.2 圆形图片加载

    复制代码
    ImageOptions options = new ImageOptions.Builder()
                    .setLoadingDrawableId(R.mipmap.ic_launcher)
                    .setFailureDrawableId(R.mipmap.ic_launcher)
                    .setUseMemCache(true)
                    .setCircular(true) // 设置成圆形图片
                    .setFadeIn(true) //淡入效果
                    .setImageScaleType(ImageView.ScaleType.FIT_CENTER)
                    .build();
    复制代码

     注:圆形图片加载options的设置对本地图片无效。

    3.3 GIF图片加载

    复制代码
    ImageOptions options = new ImageOptions.Builder()
                    .setLoadingDrawableId(R.mipmap.ic_launcher)
                    .setFailureDrawableId(R.mipmap.ic_launcher)
                    .setUseMemCache(true)
                    .setIgnoreGif(true) // 允许加载GIF图片
                    .setFadeIn(true) //淡入效果
                    .setImageScaleType(ImageView.ScaleType.FIT_CENTER)
                    .build();
    复制代码

    3.4 ImageOptions属性

    .setFadeIn(true); //淡入效果

    .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

    4. 相关资料

    ☞  Android xUtils3.0使用手册(二) - 数据库操作

    Android xUtils3.0使用手册(二) - 数据库操作

    步骤: 

    (1). 创建数据表;

    (2). DaoConfig 获取数据库的配置信息;

    (3).  获取数据库实例:  x.getDb(daoConfig);  

    (4). 数据库的增删改查。

    1. 创建数据表

        在这里要强调的是,数据库里面表的创建的时间,只有在你对数据库里面的操作涉及到这张表的操作时,会先判断当前的表是否存在,如果不存在,才会创建一张表,如果存在,才会进行相应的CRUD操作。

    复制代码
     1 @Table(name = "person") 
     2 public class person {
     3     @Column(name = "ID", isId = true, autoGen = true)
     4     public int id;
     5     @Column(name = "NAME")
     6     public String name; // 姓名
     7     @Column(name = "AGE")
     8     public int age; // 年龄
     9     @Column(name = "SEX")
    10     public String sex; // 性别
    11
    12 @Override
    13 public String toString() { 14 return "person [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]"; 15 }
    16 }
    复制代码

    上表中包含了db相关注解:

    复制代码
     1 @Check     check约束
     2 @Column    列名
     3 @Finder    一对多、多对一、多对多关系(见sample的Parent、Child中的使用)    
     4 @Foreign   外键
     5 @Id        主键,当为int类型时,默认自增。 非自增时,需要设置id的值
     6 @NoAutoIncrement  不自增
     7 @NotNull  不为空
     8 @Table    表名
     9 @Transient  不写入数据库表结构
    10 @Unique     唯一约束
    复制代码

    注解属性

    name (String)       :  表名称    
    isId (boolean)      :  是否为主键
    autoGen (boolean)   :  是否自增(默认: false)
    proprety (String)   :  是否为空(默认: NOT NULL) 

    2. DaoConfig 获取数据库的配置信息

    复制代码
     1 //本地数据的初始化
     2 DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
     3         .setDbName("my_db.db") //设置数据库名
     4         .setDbVersion(1) //设置数据库版本,每次启动应用时将会检查该版本号,
     5         // 发现数据库版本低于这里设置的值将进行数据库升级并触发DbUpgradeListener
     6         .setAllowTransaction(true) //设置是否开启事务,默认为false关闭事务
     7         .setTableCreateListener(new DbManager.TableCreateListener() {
     8                 @Override
     9                 public void onTableCreated(DbManager dbManager, TableEntity<?> tableEntity) {
    10                 }
    11         })
    12         .setDbOpenListener(new DbManager.DbOpenListener() {
    13                 @Override
    14                 public void onDbOpened(DbManager db) {
    15                     // 开启WAL, 对写入加速提升巨大
    16                     db.getDatabase().enableWriteAheadLogging();
    17                 }
    18         })
    19         // 设置数据库创建时的Listener
    20         .setDbUpgradeListener(new DbManager.DbUpgradeListener() {
    21                 @Override
    22                 public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
    23                     // TODO: ...
    24                     // db.addColumn(...);
    25                     // db.dropTable(...);
    26                     // ...
    27                     // or
    28                     // db.dropDb();
    29                 }
    30         }); //设置数据库升级时的Listener,这里可以执行相关数据库表的相关修改,比如alter语句增加字段等
    31         // .setDbDir(null);//设置数据库.db文件存放的目录,默认为包名下databases目录下
    32             
    33 DBManager db = x.getDb(daoConfig);
    复制代码

    3. 获取数据库实例

    DbManager db = x.getDb(daoConfig);

    4. 表 操作

    通过DbManager这类我们可以做如下操作:

    复制代码
    .getDaoConfig  // 获取数据库的配置信息
    .getDatabase   // 获取数据库实例  
    .replace       // 只有存在唯一索引时才有用 (慎重)
    .dropTable     // 删除表 
    .addColumn     // 添加一列 
    .dropDb        // 删除数据库
    复制代码


    5. 增 操作

    复制代码
    1 try {
    2     List<person> list = new ArrayList<person>();
    3     // ... 加载数据
    4 
    5     db.save(list); // 保存实体类或者实体类的List到数据库
    6     db.saveOrUpdate(list); // 保存或更新实体类或者实体类的List到数据库,根据id对应的数据是否存在
    7     db.saveBindingId(list); // 保存实体类或实体类的List到数据库,如果该类型的id是自动生成的,则保存完后会给id赋值
    8 } catch (DbException e) {
    9 }
    复制代码

    6. 删 操作

    复制代码
    1 try {
    2     db.delete(person.class);//该方法是删除表中的全部数据
    3     db.deleteById(person.class, 12);//该方法主要是根据表的主键(id)进行单条记录的删除
    4     db.delete(person.class, WhereBuilder.b("age", ">", "20"));//根据where语句的条件进行删除操作 
    5     List<person> findAll = db.selector(person.class).expr("age > 20").findAll();
    6     db.delete(findAll);//根据实体bean进行对表里面的一条或多条数据进行删除   
    7 } catch (DbException e) {
    8 }
    复制代码

    7. 改 操作

    复制代码
     1 // 第一种
     2 try {
     3     List<Person> findAll = db.findAll(Person.class);
     4     for (Person person : findAll) {
     5         person.setAge(10);
     6     }
     7     db.update(findAll, "age"); //可以使对象、集合
     8 } catch (DbException e) {
     9 }
    10 // 第二种
    11 try {
    12     PersonTable person = db.findById(Person.class, 1);
    13     person.setAge(25);
    14     db.update(person, "age");
    15 } catch(DbException e){
    16 }
    复制代码

    8. 查 操作

    复制代码
     1 try {
     2     db.findById(person.class, 1);//通过主键的值来进行查找表里面的数据
     3     db.findFirst(person.class);//返回当前表里面的第一条数据 
     4     List<person> findAll = db.findAll(person.class);//返回当前表里面的所有数据 
     5     db.findDbModelAll(new SqlInfo("select * from person where age > 25"));
     6     DbModel model = db.findDbModelFirst(new SqlInfo("select * from person where age > 25"));
     7     model.getString("age");//model相当于游标
     8     List<person> findAll2 = db.selector(person.class).expr("age >10").findAll();//主要是用来进行一些特定条件的查找
     9 } catch (DbException e) {
    10 }
    复制代码

    9. 相关资料

    四、网络请求

    由于Android6.0版本之后将HttpClient替换为UrlConnection,所以修改老项目的时候一定要注意。
    这里我们简单封装一下, 请求参数通过map传过来,然后通过回调返回请求结果。

    /**
     * @author nelson
     */
    public class c {
        private static  final String BASE_URL = "http://10.168.11.11/";
        
        public static void get(String url, Map<String, Object> parms, final GetDataCallback callback) {
            RequestParams params = new RequestParams(GetDataTask.BASE_URL + url);
            if(parms!=null){
                for (String key : parms.keySet()) {
                    params.addParameter(key, parms.get(key));
                }
            }
            x.http().get(params, new Callback.CommonCallback<String>() {
                @Override
                public void onSuccess(String result) {
                    callback.success(result);
                }
                @Override
                public void onError(Throwable ex, boolean isOnCallback) {
                    callback.failed();
                }
                @Override
                public void onCancelled(CancelledException cex) {}
                @Override
                public void onFinished() {}
            });
        }
    
        public static void post(String url, Map<String, Object> parms, final GetDataCallback callback) {
            RequestParams params = new RequestParams(GetDataTask.BASE_URL + url);
            if(parms!=null){
                for (String key : parms.keySet()) {
                    params.addParameter(key, parms.get(key));
                }
            }
            x.http().post(params, new Callback.CommonCallback<String>() {
                @Override
                public void onSuccess(String result) {
                    if(callback!=null){
                        callback.success(result);
                    }
                }
                @Override
                public void onError(Throwable ex, boolean isOnCallback) {
                    if(callback!=null){
                        callback.failed();
                    }
                }
                @Override
                public void onCancelled(CancelledException cex) {}
                @Override
                public void onFinished() {}
            });
        }
        /**上传文件*/
        public static void uplodFile(List<String> path, Map<String, Object> map, final GetDataCallback callback) {
            RequestParams params = new RequestParams(GetDataTask.BASE_URL+"upload");
            params.setMultipart(true);
            for (String key : map.keySet()) {
                params.addBodyParameter(key, map.get(key).toString());
            }
            for (int i = 0; i < path.size(); i++) {
                params.addBodyParameter("uploadfile" + i, new File(path.get(i)));
            }
            x.http().post(params, new Callback.CommonCallback<String>() {
                @Override
                public void onSuccess(String result) {
                    callback.success(result);
                }
                @Override
                public void onError(Throwable ex, boolean isOnCallback) {
                    callback.failed();
                }
                @Override
                public void onCancelled(CancelledException cex) {}
                @Override
                public void onFinished() {}
            });
        }
        /**回调接口*/
        public interface GetDataCallback {
            void success(String result);
            void failed(String... args);
        }
    }


    发起网络请求
    Map<String,Object> map = new HashMap<>();
    map.put("pageNumber",page);
    map.put("typeid",typeid);
    //如果请求不需要参数,传null
    // GetDataTask.post("app/types", null, new GetDataTask.GetDataCallback(){}
    GetDataTask.post("app/types", map, new GetDataTask.GetDataCallback() {
       @Override
       public void success(String response) {
           Gson gson = new Gson(); //后台返回来的json格式,其他格式自己处理
           Result result = gson.fromJson(response, Result.class);
       }
       @Override
       public void failed(String... args) {
       }
    });


    五、绑定图片

    //通过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
    
    x.image().bind(imageView, url, imageOptions);
    // 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>() {
        @Override
        public void onSuccess(Drawable result) {
        }
        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
        }
        @Override
        public void onCancelled(CancelledException cex) {
        }
        @Override
        public void onFinished() {
        }
    x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
    // 用来获取缓存文件
    x.image().loadFile(url, imageOptions, new Callback.CommonCallback<File>() {...});
    

     

    六、异步执行任务

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

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

    七、ORM 数据库操作

    DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
            //设置数据库名,默认xutils.db
            .setDbName("myapp.db")
            //设置数据库路径,默认存储在app的私有目录
            .setDbDir(new File("/mnt/sdcard/"))
            //设置数据库的版本号
            .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());
                }
            });

    操作数据库
    // User类在最底下
    DbManager db = x.getDb(daoConfig);
    db.dropDb(); // 删除数据库
    db.dropTable(User.class); // 删除表
    db.save(new User("nelson")); //新增数据
    db.delete(User.class); //mtb_user表中数据将被全部删除
    //条件删除:
    WhereBuilder b = WhereBuilder.b();
    b.and("id",">",2); //构造修改的条件
    b.and("id","<",4);
    db.delete(User.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);

    条件查询
    Parent test = db.selector(Parent.class).where("id", "in", new int[]{1, 3, 6}).findFirst();
    long count = db.selector(Parent.class).where("name", "LIKE", "w%").and("age", ">", 32).count();
    List<Parent> testList = db.selector(Parent.class).where("id", "between", new String[]{"1", "5"}).findAll();


  • 相关阅读:
    MiniUi绑定mini-combobox下拉框
    ORA-01658:无法为表空间XXX中的段创建initial区
    ora-01033:oracle initialization or shutdown in progress 解决方法
    MVC示例
    NHibernate概念
    流程的python PDF高清版
    正则指引 pdf 高清版
    第三方库:logger,自定义日志封装模块
    python2.* 版本 与 3.* 版本中的区别
    Selenium2+python自动化-文件上传
  • 原文地址:https://www.cnblogs.com/Alex80/p/13621829.html
Copyright © 2011-2022 走看看