Android 开源框架 ( 四 ) Afinal --- Android 里的 ORM IOC聚合型框架
Afinal 是一个android的sqlite的 orm 和 ioc 框架.是一种聚合型框架, 大而全。所以不推荐使用,只做了解即可.应付手头临时项目.
推荐阅读,这么多开源框架,该用哪个好?:
一.引言
Afinal是一个开源的android的orm和ioc应用开发框架.在android应用开发中,FinalActivity模块通过Afinal的ioc框架,诸如ui绑定,事件绑定,通过注解可以自动绑定。Afinal的orm框架,很轻松的就可以对android的sqlite数据库进行增删改查操作,Afinal内嵌了finalHttp等简单易用的工具,可以轻松的对http进行请求操作
二.注解介绍
说道注解首先接触最多的是@Override: 表示该方法是重写父类中的方法,编译的时候会检查该方法,如果这个方法不是父类中存在的将会报错.
java.lang.annotation 中包含所有定义自定义注解所需用到的原注解和接口。接口java.lang.annotation.Annotation 是所有注解继承的接口,并且是自动继承,不需要定义时指定,类似于所有类都自动继承Object。所以很多java.lang.annotation种的注册我们可以直接使用.
注解三种保留方式:
@Retention: 定义注解的保留策略
@Retention(RetentionPolicy.SOURCE)//注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)// 默认的保留策略,注解会在class字节码文件中存在,但运行时无法得
@Retention(RetentionPolicy.RUNTIME)// 注解会在class字节码文件中存在,在运行时可以通过反射获取到
1.SOURCE:只保留在源码中,不保留在class中,同时也不加载到虚拟机中.
2.CLASS:保留在源码中,同时也保留到class中,但是不加载到虚拟机中.在程序编译时根据注解进行一些额外的操作,大名鼎鼎的ButterKnife运用的就是编译时注解,ButterKnife在我们编译时,就根据注解,自动生成了一些辅助类。
3.RUNING:保留到源码中,同时也保留到class中,最后加载到虚拟机中.在运行时环境下运用反射,动态获取对象、属性、方法等,一般的IOC框架就是这样,可能会牺牲一点效率。 EventBus是使用运行时注解,主要的作用是在运行的时候会去查找所有被注解的方法,然后再去解析注解。运行时注解会影响程序的性能,毕竟在运行的时候有一个查找的过程,所以运行时注解的作用一般是标记一个作用区。
三.Afinal 介绍
Afinal的四大模块:
FinalDB模块:android中的orm框架,一行代码就可以进行增删改查。支持一对多,多对一等查询。
FinalActivity模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。
FinalHttp模块:通过httpclient进行封装http数据请求,支持ajax方式加载。
FinalBitmap模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。FinalBitmap的内存管理使用lru算法,没有使用弱引用(android2.3以后google已经不建议使用弱引用,android2.3后强行回收软引用和弱引用,详情查看android官方文档),更好的管理bitmap内存。FinalBitmap可以自定义下载器,用来扩展其他协议显示网络图片,比如ftp等。同时可以自定义bitmap显示器,在imageview显示图片的时候播放动画等(默认是渐变动画显示)。
四.Afinal 使用
1.引入jar包
2.授权
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3.FinalDB使用
FinalDb db = FinalDb.create(this); User user = new User(); user.setEmail("1@qq.com"); user.setId(1); user.setName("oreo"); db.save(user);
查看下源码:(最后还是转成sql执行)
public void save(Object entity) { this.checkTableExist(entity.getClass()); this.exeSqlInfo(SqlBuilder.buildInsertSql(entity)); }
public static SqlInfo buildInsertSql(Object entity) { List<KeyValue> keyValueList = getSaveKeyValueListByEntity(entity); StringBuffer strSQL = new StringBuffer(); SqlInfo sqlInfo = null; if(keyValueList != null && keyValueList.size() > 0) { sqlInfo = new SqlInfo(); strSQL.append("INSERT INTO "); strSQL.append(TableInfo.get(entity.getClass()).getTableName()); strSQL.append(" ("); Iterator var5 = keyValueList.iterator(); while(var5.hasNext()) { KeyValue kv = (KeyValue)var5.next(); strSQL.append(kv.getKey()).append(","); sqlInfo.addValue(kv.getValue()); } strSQL.deleteCharAt(strSQL.length() - 1); strSQL.append(") VALUES ( "); int length = keyValueList.size(); for(int i = 0; i < length; ++i) { strSQL.append("?,"); } strSQL.deleteCharAt(strSQL.length() - 1); strSQL.append(")"); sqlInfo.setSql(strSQL.toString()); } return sqlInfo; }
4.FinalBitmap使用
// 开始加载图片 finalBitmap.display(iv_afinal,"https://images2018.cnblogs.com/blog/612293/201807/612293-20180722160006222-1427704878.jpg");
查看下源码:
private void doDisplay(View imageView, String uri, BitmapDisplayConfig displayConfig) { if(!this.mInit) { this.init(); } if(!TextUtils.isEmpty(uri) && imageView != null) { if(displayConfig == null) { displayConfig = this.mConfig.defaultDisplayConfig; } Bitmap bitmap = null; if(this.mImageCache != null) {
//优先缓存获取
bitmap = this.mImageCache.getBitmapFromMemoryCache(uri); } if(bitmap != null) { if(imageView instanceof ImageView) { ((ImageView)imageView).setImageBitmap(bitmap); } else { imageView.setBackgroundDrawable(new BitmapDrawable(bitmap)); } } else if(checkImageTask(uri, imageView)) {
//FinalBitmap模块 加载图片 FinalBitmap.BitmapLoadAndDisplayTask task = new FinalBitmap.BitmapLoadAndDisplayTask(imageView, displayConfig); FinalBitmap.AsyncDrawable asyncDrawable = new FinalBitmap.AsyncDrawable(this.mContext.getResources(), displayConfig.getLoadingBitmap(), task); if(imageView instanceof ImageView) { ((ImageView)imageView).setImageDrawable(asyncDrawable); } else { imageView.setBackgroundDrawable(asyncDrawable); } task.executeOnExecutor(this.bitmapLoadAndDisplayExecutor, new Object[]{uri}); } } }
5.FinalHttp下载文件
FinalHttp finalHttp = new FinalHttp(); // 请求网络资源的地址 String url = ""; // 存放视频文件到本地位置 String target = getFilesDir()+"/testAfinal.mp4"; finalHttp.download(url, target, new AjaxCallBack<File>() { @Override public void onSuccess(File file) { tv_afinal_result.setText("下载文件成功"); super.onSuccess(file); } @Override public void onFailure(Throwable t, int errorNo, String strMsg) { tv_afinal_result.setText("下载文件失败"); super.onFailure(t, errorNo, strMsg); } @Override public void onStart() { tv_afinal_result.setText("开始下载"); super.onStart(); } });
6.FinalHttp上传文件
FinalHttp finalHttp = new FinalHttp(); // 文件上传到服务器的位置 String url = ""; AjaxParams params = new AjaxParams(); // 获取要上传的本地资源 try { params.put("File",new File(getFilesDir()+"/testAfinal.mp4")); } catch (FileNotFoundException e) { e.printStackTrace(); } finalHttp.post(url, params, new AjaxCallBack<Object>() { @Override public void onStart() { tv_afinal_result.setText("开始上传"); super.onStart(); } @Override public void onSuccess(Object o) { tv_afinal_result.setText("上传成功"); super.onSuccess(o); } @Override public void onFailure(Throwable t, int errorNo, String strMsg) { tv_afinal_result.setText("上传失败"); super.onFailure(t, errorNo, strMsg); } });