zoukankan      html  css  js  c++  java
  • 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);
                }
            });
  • 相关阅读:
    MVC页面打印成pdf插件Rotativa
    lambda表达式嵌套
    MVC+EF五种条件查询获取数据列表方式
    自己写的通用分页存储过程
    Llinux命令大全之软件管理命令
    .net开发 chrome核心浏览器组件
    常用的SQL日期操作
    Linux各版本介绍说明
    大数据环境搭建
    markdown语法链接新页面打开
  • 原文地址:https://www.cnblogs.com/bugzone/p/afinal.html
Copyright © 2011-2022 走看看