Xutils3Android功能最广的开源框架
2016-06-13 19:32
309 查看
首先,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’
点击同步按钮,等运行完毕即可。点开项目中的External Libraries中看到有如图中的xutils,那么恭喜你,你已经导入成功了。
接下来要在manifest文件中写入如下两个权限
接下来我们来看我们的重点,Xutils3的操作。
1. 首先在Application类中的inCreate()方法中注册Xutils3,只有注册了才能用。
public class BaseApplication extends Application{ @Override public void onCreate() { super.onCreate(); x.Ext.init(this); } }
然后在manifest文件中给这个Application添加上name属性。如图
从现在开始,开始介绍我们的功能模块。
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中操作数据库中的一对多,多对多将会另写一篇博客来分享~
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories