xUtils3入门使用及部分解析(1)

public @interface Event {

/**

  • 控件的id集合, id小于1时不执行ui事件绑定.

*/

int[] value();

/**

  • 控件的parent控件的id集合, 组合为(value[i], parentId[i] or 0).

*/

int[] parentId() default 0;

/**

  • 事件的listener, 默认为点击事件.

*/

Class<?> type() default View.OnClickListener.class;

/**

  • 事件的setter方法名, 默认为set+type#simpleName.

*/

String setter() default “”;

/**

  • 如果type的接口类型提供多个方法, 需要使用此参数指定方法名.

*/

String method() default “”;

}

这里有几点注意点:

  • 注解的方法必须用private进行修饰

  • 对于返回值类型没有要求

  • 参数名和type的接口要求的参数名要一致

  • 多个value值用{}括起来

举一个小例子:

@Event(value = {R.id.btn1,R.id.btn2,R.id.btn3})

private void onClick(View v) {

switch (v.getId()){

case R.id.btn1 :

Toast.makeText(getApplicationContext(),“btn1被点击了”,Toast.LENGTH_LONG).show();

case R.id.btn2 :

Toast.makeText(getApplicationContext(),“btn2被点击了”,Toast.LENGTH_LONG).show();

case R.id.btn3 :

Toast.makeText(getApplicationContext(),“btn3被点击了”,Toast.LENGTH_LONG).show();

}

}

btn


DbUtils模块的使用

首先,我们在MainActivity中new一个DbManager.DaoConfig

这个DaoConfig都有什么东西呢?这里我总结一下:

public DaoConfig setDbDir(File dbDir) #设置数据库存储目录

public DaoConfig setDbName(String dbName) #设置数据库名

public DaoConfig setDbVersion(int dbVersion) #设置数据库版本

public DaoConfig setAllowTransaction(boolean allowTransaction) #设置是否开启事务(默认为true)

public DaoConfig setDbOpenListener(DbOpenListener dbOpenListener) #数据库打开监听

public DaoConfig setDbUpgradeListener(DbUpgradeListener dbUpgradeListener) #数据库更新监听

public DaoConfig setTableCreateListener(TableCreateListener tableCreateListener) #监听表创建

了解清楚后,我们可以开始配置了:

1.创建并配置DbManager

@ContentView(R.layout.activity_main)

public class MainActivity extends AppCompatActivity {

DbManager db;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// setContentView(R.layout.activity_main);

//创建并配置DaoConfig

DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()

.setDbName(“test1.db”)

.setDbDir(new File(“/sdcard”))

.setDbVersion(2)

.setDbOpenListener(new DbManager.DbOpenListener() {

@Override

public void onDbOpened(DbManager db) throws DbException {

//开启WAL,提升写入速度

db.getDatabase().enableWriteAheadLogging();

}

})

.setDbUpgradeListener(new DbManager.DbUpgradeListener() {

@Override

public void onUpgrade(DbManager db, int oldVersion, int newVersion) throws DbException {

//可进行建表等相关操作

}

});

try {

db = x.getDb(daoConfig);

} catch (DbException e) {

e.printStackTrace();

}

}

}

2.创建实体类

接下来创建一个User表作为数据库的实体类:(具体注释的用途已标明)

//声明其为一个表,给xutils解析 表名为user,onCreated处填写sql语句,则表创建时将执行(默认为空)

@Table(name=“user”,onCreated = “”)

public class User {

//isId告诉xutils其为id,autoGen设置是否自增

@Column(name = “id”,isId = true,autoGen = true,property = “NOT NULL”)

private int id;

@Column(name = “name”)

private String name;

//注意一定要保留这个无参构造,否则建表将会失败

public User(){

}

public User(String name) {

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

3.实现CRUD方法

在MainActivity中使用DbManager的CRUD方法:

(这里使用到了**@Event**注解,这个注解只需传入按钮的id,即可在标注的方法中进行该按钮的监听事件,让我们省了不少功夫)

@Event(R.id.save)

private void save(View v) throws DbException {

ArrayList users = new ArrayList<>();

users.add(new User(“zhangsan”));

users.add(new User(“lisi”));

//不仅仅可以进行单个用户的插入,还能实现List的插入

db.save(users);

Log.i(“test”,“建表成功”);

}

@Event(R.id.delete)

private void del(View v) throws DbException {

//whereBuilder即为一个条件类,在其中可以运行有条件的SQL语句

//传入id = 1

db.delete(User.class, WhereBuilder.b().and(“id”,“=”,1));

Log.i(“test”,“删除成功”);

}

@Event(R.id.update)

private void update(View v) throws DbException {

//将id=1的数据的name值改为Nick

db.update(User.class,WhereBuilder.b().and(“id”,“=”,1),new KeyValue(“name”,“Nick”));

Log.i(“test”,“修改成功”);

}

@Event(R.id.query)

private void select(View v) throws DbException {

//查找出id=1的值

User user = db.selector(User.class).where(“id”,“=”,1).findFirst();

Log.i(“test”,“用户名为:”+user.getName());

Toast.makeText(getApplicationContext(),user.getName(),Toast.LENGTH_LONG).show();

}

结果如下:

image-20200604170914480

image-20200604171054469


HttpUtils模块的使用

通常,我们的Get请求会有一长串的字符参数跟在请求地址后面,而通过HttpUtils,则可以让它像Post请求一样,组成一个字符串直接封装至请求方法中去,同时也可以设置自定义属性。

Get请求

首先我们进行Get请求的学习:

在一个按钮的监听事件里添加如下代码:x.http().get(),我们点击进该方法查看需要什么参数。

/**

  • 异步GET请求

*/

Callback.Cancelable get(RequestParams entity, Callback.CommonCallback callback);

它需要一个RequestParams和一个Callback,怎么办?new它。下面就是get请求的具体实现了:

@Event(R.id.get)

public void Get(View v){

RequestParams params = new RequestParams(url);

//添加参数

params.addQueryStringParameter(“username”,“zahngsan”);

params.addQueryStringParameter(“password”,“1234”);

x.http().get(params, new Callback.CacheCallback() {

//成功

@Override

public void onSuccess(String result) {

}

//失败

@Override

public void onError(Throwable ex, boolean isOnCallback) {

}

//主动取消回调

@Override

public void onCancelled(CancelledException cex) {

}

//请求完成的回调

@Override

public void onFinished() {

}

//缓存

@Override

public boolean onCache(String result) {

return false;

}

});

}

Post请求

类似的,我们也可以写出post请求:

@Event(R.id.post)

public void Post(View v){

RequestParams params = new RequestParams(url);

//添加参数

params.addBodyParameter(“username”,“zahngsan”);

params.addParameter(“password”,“1234”);

//请求头

params.addHeader(“head”,“test”);

x.http().get(params, new Callback.CacheCallback() {

//成功

@Override

public void onSuccess(String result) {

}

//失败

@Override

public void onError(Throwable ex, boolean isOnCallback) {

}

//主动取消回调

@Override

public void onCancelled(CancelledException cex) {

}

//请求完成的回调

@Override

public void onFinished() {

}

});

}

同时,它也对上传文件和下载文件做了支持。

上传文件

@Event(R.id.up)

private void up(View v){

String path=“/mnt/sdcard/Download/nick.jpg”;

RequestParams params = new RequestParams(url);

params.setMultipart(true);

params.addBodyParameter(“file”,new File(path));

x.http().post(params, new Callback.CommonCallback() {

@Override

public void onSuccess(String result) {

}

@Override

public void onError(Throwable ex, boolean isOnCallback) {

}

@Override

public void onCancelled(CancelledException cex) {

}

@Override

public void onFinished() {

}

});

}

下载文件

@Event(R.id.down)

private void down(View v){

String url = “https://down.qq.com/qqweb/QQ_1/android_apk/Android_8.3.6.4590_537064458.apk”;

RequestParams params = new RequestParams(url);

//定义存储的目录

params.setSaveFilePath(Environment.getExternalStorageDirectory()+“/test”);

//设置文件自动命名

params.setAutoRename(true);

x.http().post(params, new Callback.ProgressCallback() {

@Override

public void onSuccess(File result) {

//apk下载完成后,调用系统的安装方法

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(Uri.fromFile(result), “application/vnd.android.package-archive”);

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(“test”,“current=”+“,total=”+total);

}

});

}

image-20200604212455322


BitmapUtils模块的使用

xUtils3在xUtils的图片绑定基础上,增加了支持gif,以及圆角、方形等裁剪。这部分内容重点在于加载图片的4个bind方法,loadDrawable与loadFIle用法和ImageOptions用法。

首先,我可以打开**x.image().bind()**的接口感受一下它的源码,通过源码对它有所认识

public interface ImageManager {

void bind(ImageView view, String url);

void bind(ImageView view, String url, ImageOptions options);

void bind(ImageView view, String url, Callback.CommonCallback callback);

void bind(ImageView view, String url, ImageOptions options, Callback.CommonCallback callback);

Callback.Cancelable loadDrawable(String url, ImageOptions options, Callback.CommonCallback callback);

Callback.Cancelable loadFile(String url, ImageOptions options, Callback.CacheCallback callback);

void clearMemCache();

void clearCacheFiles();

}

可见,里面有4个重载的bind方法

lmageOptions

我们再来看看它的ImageOptions都能做什么:

setFadeIn(true) //设置淡入效果

setCircular(true) //设置图片显示为圆形

setSquare(true) //设置图片显示为正方形

setCrop(true).setSize(100,100) //设置图片大小

setAnimation(animation) //设置动画

setFailureDrawable(Drawable failureDrawable) //设置加载失败的动画

setFailureDrawableId(int failureDrawable) //以资源id设置加载失败的动画

setLoardingDrawable(Drawable loardingDrawable) //设置加载中动画

setLoadingDrawableId(int loadingDrawable) //以资源id设置加载中的动画

setParamsBuilder(ParamsBuilder paramsBuilder) //在网络请求中添加参数

setIgnoreGif(false) //忽略Gif图片

setRaduis(int raduis) //设置拐角弧度

setUseMemCache(true) //设置使用MemCache

bind

这里我主要就简单介绍一下其中一个bind方法的使用:

@ContentView(R.layout.activity_main)

public class MainActivity extends AppCompatActivity {

String url = “https://i.picsum.photos/id/1/5616/3744.jpg”;

@ViewInject(R.id.img)

ImageView iv;

@ViewInject(R.id.tv)

TextView tv;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

x.view().inject(this);

ImageOptions options = new ImageOptions.Builder()

.setFadeIn(true)

.setCrop(true)

.setSize(300,300).build();

x.image().bind(iv, url,options, new Callback.CacheCallback() {

@Override

//缓存

public boolean onCache(Drawable result) {

return false;

}

@Override

public void onSuccess(Drawable result) {

tv.setText(“图片加载成功”);

}

@Override

public void onError(Throwable ex, boolean isOnCallback) {

tv.setText(“图片加载错误”);

}

@Override

public void onCancelled(CancelledException cex) {

}

@Override

public void onFinished() {

}

});

}

}

运行结果:

image-20200604223456035

loadDrawable

接着学习一下loadDrawable,使用它其实和bind效果一致,但是它会将加载的图片保存在本地

x.image().loadDrawable(url,options, new Callback.CommonCallback() {

@Override

public void onSuccess(Drawable result) {

iv.setImageDrawable(result);

tv.setText(“图片加载成功”);

}

@Override

public void onError(Throwable ex, boolean isOnCallback) {

tv.setText(“图片加载错误”);

}

@Override

public void onCancelled(CancelledException cex) {

}

@Override

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

文末

架构师不是天生的,是在项目中磨练起来的,所以,我们学了技术就需要结合项目进行实战训练,那么在Android里面最常用的架构无外乎 MVC,MVP,MVVM,但是这些思想如果和模块化,层次化,组件化混和在一起,那就不是一件那么简单的事了,我们需要一个真正身经百战的架构师才能讲解透彻其中蕴含的深理。

移动架构师

系统学习技术大纲

一线互联网Android面试题总结含详解(初级到高级专题)

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-kmVbNey5-1712677645569)]

[外链图片转存中…(img-NA8Gb0oq-1712677645569)]

[外链图片转存中…(img-nXJSAkCZ-1712677645570)]

[外链图片转存中…(img-oraXhPCe-1712677645570)]

[外链图片转存中…(img-0gCprR5m-1712677645570)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

文末

架构师不是天生的,是在项目中磨练起来的,所以,我们学了技术就需要结合项目进行实战训练,那么在Android里面最常用的架构无外乎 MVC,MVP,MVVM,但是这些思想如果和模块化,层次化,组件化混和在一起,那就不是一件那么简单的事了,我们需要一个真正身经百战的架构师才能讲解透彻其中蕴含的深理。

[外链图片转存中…(img-n4TgaElg-1712677645571)]

[外链图片转存中…(img-WJ7pTMrU-1712677645571)]

一线互联网Android面试题总结含详解(初级到高级专题)

[外链图片转存中…(img-Q5Gp3V8T-1712677645572)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值