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

 

posted @ 2018-07-30 23:07  FreeFunCode  阅读(120)  评论(0编辑  收藏