Xutils3Android功能最广的开源框架

时间:2022-10-21 07:52:50
    首先,Xutils是我接触的第一个开源框架,在刚开始使用框架的时候概念很模糊,但是在后期的使用中,发现它的功能真的很强大,现在Xutils已经不进行维护,但是现在又发表了xutils3这个开源框架,这次的改变在api上进行了巨大的改变,由于熟悉了以前的方式,所以刚刚接触不是很熟悉,写篇博客记录下来。
Xutils3在功能上和Xutils是一致的,分别是:
1.用注解的方式替代findViewById()来实例化控件并且通过注解的方式为各个空间添加监听事件。
2.通过Xutils来加载网络图片,不必担心出现oom的现象。
3.通过Xutils来封装好的回调方法进行访问网络,下载和上传,可以上传超过2G的文件,
4.通过Xutils来操作数据库,在之前使用greenDao的时候虽然没有写sql语句,但是必须保存到数据库中的实体类是自己生成的实体类,而且会写很繁杂的代码,在Xutils3中,对数据库的操作的效率与greenDao相似,但是操作起来却很容易,真的很棒(本人很讨厌写sql语句,哈哈~);
更多的介绍请看Xutils的介绍,项目地址:

https://github.com/wyouflf/xUtils3
1.使用Xutils3前期准备
在项目中的build.grade中添加
compile ‘org.xutils:xutils:3.3.36’
Xutils3Android功能最广的开源框架
点击同步按钮,等运行完毕即可。点开项目中的External Libraries中看到有如图中的xutils,那么恭喜你,你已经导入成功了。
Xutils3Android功能最广的开源框架
接下来要在manifest文件中写入如下两个权限
Xutils3Android功能最广的开源框架

接下来我们来看我们的重点,Xutils3的操作。
1. 首先在Application类中的inCreate()方法中注册Xutils3,只有注册了才能用。

public class BaseApplication extends Application{

@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
}
}

然后在manifest文件中给这个Application添加上name属性。如图
Xutils3Android功能最广的开源框架

从现在开始,开始介绍我们的功能模块。

1.Xutils3的注解功能:

这个功能我在用的时候很少用,还是喜欢用findViewById()的方式来写,因为不可能我随便一个功能很简单的项目都要使用Xutils,而且用Inflator去加载一个布局的时候容易混淆,我这里不推荐使用。

2.Xutils3加载网络图片的功能

访问网络的时候难免要将网络上的图片加载到本地,但是由于图片有时候过大而出现oom,但是有了Xutils3我们将不必再担心任何问题。
接下来介绍加载网络图片的4个bind方法和两个load方法:
/**
* 加载图片的4个bind方法和两个load方法
*/

public class ImageActivty extends AppCompatActivity {

private android.widget.ImageView iv01;
private android.widget.ImageView iv02;
private android.widget.ImageView iv03;
private android.widget.ImageView iv04;
private android.widget.ImageView iv05;
String[] urls = new String[]{ "http://img5.wtoutiao.com/url=http://mmbiz.qpic.cn/mmbiz/qPfEGxhqzxNYskJQUiaGZ6wydt7zsLcASiaqtTJb6jysI6Gibk8SyFf2XMvuwb992rL6whChpqSZOpYMpXrfHTxibg/0",
"http://i7.qhimg.com/t01755f436ab31acc3e.jpg", "http://pic36.nipic.com/20131128/11748057_141932278338_2.jpg", "http://www.wed114.cn/jiehun/uploads/allimg/160426/39_160426110638_1.jpg", "http://www.wed114.cn/jiehun/uploads/allimg/160426/39_160426110624_1.jpg"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_activyt);
x.view().inject(this);
this.iv05 = (ImageView) findViewById(R.id.iv05);
this.iv04 = (ImageView) findViewById(R.id.iv04);
this.iv03 = (ImageView) findViewById(R.id.iv03);
this.iv02 = (ImageView) findViewById(R.id.iv02);
this.iv01 = (ImageView) findViewById(R.id.iv01);
setPic();
}
private void setPic() {
ImageOptions imageOptions = new ImageOptions.Builder()
.setCircular(true)
.setIgnoreGif(true)
.build();
ImageOptions imageOptions2 = newImageOptions.Builder()
.setSquare(true)
.build();
ImageOptions imageOptions3 = new ImageOptions.Builder()
.setCrop(true)
.setSize(200, 200)
.build();
x.image().bind(iv01, urls[0], imageOptions);
x.image().bind(iv02, urls[1], imageOptions2);
x.image().bind(iv03, urls[2], 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().bind(iv04, urls[3], imageOptions3, 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(urls[4], imageOptions, new Callback.CommonCallback<Drawable>() {
@Override
public void onSuccess(Drawable result) {
iv05.setImageDrawable(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {

}

@Override
public void onCancelled(CancelledException cex) {

}

@Override
public void onFinished() {

}
});
x.image().loadFile(urls[0], imageOptions, new Callback.CacheCallback<File>() {
@Override
public boolean onCache(File result) {
//图片另存为等操作
Log.e("ImageActivty", result.getPath() + result.getName());
//如果return true,那么在规定的时间内从缓存里拿,网络中返回的值为null,如果return false,那么在规定的时间内还可以从网络中获取。
return true;
}

@Override
public void onSuccess(File result) {

}

@Override
public void onError(Throwable ex, boolean isOnCallback) {

}

@Override
public void onCancelled(CancelledException cex) {

}

@Override
public void onFinished() {

}
});
}
}

3.Xutils3访问网络的功能。

public class InternetActivity extends AppCompatActivity implements View.OnClickListener {

private android.widget.Button get;
private android.widget.Button post;
private android.widget.Button other;
private android.widget.Button upload;
private android.widget.Button download;
private android.widget.Button cathe;
private String url = "http://www.baidu.com";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_internet);
x.view().inject(this);
this.cathe = (Button) findViewById(R.id.cathe);
this.download = (Button) findViewById(R.id.download);
this.upload = (Button) findViewById(R.id.upload);
this.other = (Button) findViewById(R.id.other);
this.post = (Button) findViewById(R.id.post);
this.get = (Button) findViewById(R.id.get);
get.setOnClickListener(this);
post.setOnClickListener(this);
other.setOnClickListener(this);
upload.setOnClickListener(this);
download.setOnClickListener(this);
cathe.setOnClickListener(this);
}

@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.get:
RequestParams requestParams1 = new RequestParams(url);
requestParams1.addQueryStringParameter("name", "zhangsan");
x.http().get(requestParams1, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
String a = result;
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {

}

//cancelable.cancel会调用这个方法
@Override
public void onCancelled(CancelledException cex) {

}
//不管请求成功或失败,都会运行这个方法
@Override
public void onFinished() {

}
});
break;
case R.id.post:
RequestParams requestParams = new RequestParams(url)
requestParams.addParameter("adminpass", "zhuli123");//这个方法会选择
x.http().post(requestParams, new Callback.CommonCallback<byte[]>() {
@Override
public void onSuccess(byte[] result) {
String a = new String(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {

}
@Override
public void onCancelled(CancelledException cex) {

}
@Override
public void onFinished() {
}
});
break;
case R.id.other:
RequestParams requestParams2 = new RequestParams(url);
requestParams2.addParameter("name", "hou");
x.http().request(HttpMethod.PUT, requestParams2, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {

}
@Override
public void onError(Throwable ex, boolean isOnCallback) {

}

@Override
public void onCancelled(CancelledException cex) {

}

@Override
public void onFinished() {

}
});
break;
case R.id.upload:
String path = "/1.png";//图片路径
RequestParams requestParams3 = new RequestParams(url);
requestParams3.addBodyParameter("file", new File(path));
requestParams3.setMultipart(true);//上传一般为表单上传
x.http().post(requestParams3, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {

}

@Override
public void onError(Throwable ex, boolean isOnCallback) {

}

@Override
public void onCancelled(CancelledException cex) {

}

@Override
public void onFinished() {

}
});
break;
case R.id.download:
RequestParams requestParams4 = new RequestParams(url);
requestParams4.setSaveFilePath(Environment
.getExternalStorageState() + "/jikeapp/");
requestParams4.setAutoRename(true);
x.http().post(requestParams4, new Callback.ProgressCallback<File>() {
@Override
public void onSuccess(File result) {
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) {

}
});
break;
case R.id.cathe:
RequestParams params = new RequestParams(url);
params.setCacheMaxAge(1000 * 60);
x.http().post(params, new Callback.CacheCallback<String>() {
@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) {
//1.false 不相信本地缓存,会再去请求网络数据
//2.true 相信本地缓存,在60秒之内不去回调网络,onSuccess中返回的result为空
return false;
}
});
break;
}
}
}

4.Xutils操作数据库的功能。

首先要实例化DaoConfig对象,里面有set方法来设置数据库的相关属性

DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
.setDbName("xingege.db")
.setTableCreateListener(new
.setDbVersion(1)
.setDbUpgradeListener(new DbManager.DbUpgradeListener() {
@Override
public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
//.....................
}
})
.setDbOpenListener(new DbManager.DbOpenListener() {
@Override
public void onDbOpened(DbManager db) {
//开启后加速写入的速度
db.getDatabase().enableWriteAheadLogging();
}
});
得到db对象
 DbManager db = x.getDb(daoConfig);
将对象存入数据库
 //保存的时候必须用无参构造函数来构建对象,不然sava对象的时候这张表的创建会出问题
ChildInfo zhangsan = new ChildInfo();
zhangsan.setName("zhangsan");
zhangsan.setAge(20);
try {
db.save(zhangsan);
} catch (DbException e) {
e.printStackTrace();
}
ChildInfo类用注解的方式说明数据库中的存储的属性
@Table(name = "childInfo",onCreated = "")
public class ChildInfo {
@Column(name = "id",isId = true,autoGen = true,property = "NOT NULL")
private int id;
@Column(name = "name")
private String name;
@Column(name = "age")
private int age;

public ChildInfo( String name, int age) {

this.name = name;
this.age = age;
}
//在使用Xutils的时候必须要声明自己的空构造函数,不然这张表是建立不成功的,自己在声明的时候一定要将空的构造函数加上
public ChildInfo() {
}

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;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

好了,上面就是xutils的基本操作了,自己做一个记录方便查看,也提供给大家一起学习,Xutils中操作数据库中的一对多,多对多将会另写一篇博客来分享~