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("[email protected]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);
            }
        });

原文地址:https://www.cnblogs.com/bugzone/p/afinal.html

时间: 2024-10-11 06:32:17

Android 开源框架 ( 四 ) Afinal --- Android 里的 ORM IOC聚合型框架的相关文章

Android 开源框架 ( 五 ) xUtils --- Android 里的 ORM IOC聚合型框架

xUtils同Afinal一样属于聚合型框架, 大而全,但是越容易牵一发而动全身.所以不推荐使用,只做了解即可.应付手头临时项目. Android 开源框架 ( 四 ) Afinal --- Android 里的 ORM IOC聚合型框架 一.Xutils 介绍 Xutils是基于afinal开发的,但是比afinal稳定性提高了不少.xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事

Android 开源项目 eoe 社区 Android 客户端(转)

本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,采用侧边菜单栏.可以学习一下.点击此处查看 GitHub 上的项目. 今天调试几个开源的 Andriod 项目,像什么 oschina,apolloMod 等等,都跑不起来,nnd 郁闷了,不是这有问题,就是那有问题.尤其是 apolloMod,用了很多三方库,完全跑不起来嘛,最无奈的是 oschina,必须将 API 降到 15,也就是 Android

Android 开源项目 eoe 社区 Android 客户端

本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,菜单采用侧边栏方式.可以学习一下.点击此处查看 GitHub 上的项目. GitHub下载 本地下载 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.3 SAMSUNG GT-I9008L,Android OS 2.2.2 开源项目 eoe 社区 Android 客户端 启动过程,Andro

Android学习(四)——Android布局模式

除了上面我们谈过的控件外,其实还有非常多其他的.我们谈的基本都是非常基础的,因此其他的控件还需要学习者在后面制作中进行学习.除了这些组件外,我们还需要有一些东西把这些组件包含在内,这东西就是我们所说的布局. Android中有四种基本的布局模式(Layout):LinearLayout, RelativeLayout, TableLayout, FrameLayout  ———————————————————华丽丽的分割线—————————————————————— 1. LinearLayou

android学习十四(android的接收短信)

收发短信是每个手机基本的操作,android手机当然也可以接收短信了.android系统提供了一系列的API,使得我们可以在自己的应用程序里接收和发送短信. 其实接收短信主要是利用我们前面学过的广播机制.当手机接收到一条短信的时候,系统会发出一条值为andorid.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据.每个应用程序都可以在广播接收器里对它进行监听,收到广播时在从中解析出短信的内容即可. 下面我们来个具体的例子实践下吧,新建一个

处女男学Android(十四)---Android 重量级数据存储之SQLite

前言 不知不觉的Android基础系列已经写了十三篇了,这是第十四篇~上一篇blog记录了Android中的一种数据存储方案,即共享参数(Sharedpreferences)的使用(处女男学Android(十三)---Android 轻量级数据存储之SharedPreferences).最近初学如何在Android中应用SQLite,写了一个基于ListView的增删查的小例子,本篇blog就记录一下我学习到的如何在Android中操作SQLite持久化客户端数据. 初始化SQLite 关于SQ

Android开源项目:GifView——Android显示GIF动画

下载:http://code.google.com/p/gifview/downloads/list 简介:android中现在没有直接显示gif的view,只能通过mediaplay来显示,且还常常不能正常显示出来,为此写了这个gifview,其用法和imageview一样 使用方法: 1-把GifView.jar加入你的项目. 2-在xml中配置GifView的基本属性,GifView继承自View类,和Button.ImageView一样是一个UI控件.如: <com.ant.liao.G

&lt;Android开源库&gt; Realm For Android~ Getting Help and Models(译文)

帮助 编程问题?询问StackOverflow, 我们会积极地监督和回答问题! 提交Bug? 在我们的repo打开一个问题. 如果可以的话,请告知我们Realm版本,完整日志,Realm文件和显示问题的项目. 功能请求? 在我们的repo打开一个问题. 告诉我们该功能应该做什么,以及为什么需要该功能. 想了解接下来我们会更新什么内容? 看看我们的changelog. 日志显示我们计划最近发布的最新添加和更改,以及Realm的发展历史. 模型 Realm model类都是RealmObject的子

Android开源项目及库搜集

TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending,github搜索:https://github.com/search 目录 UI 卫星菜单 节选器 下拉刷新 模糊效果 HUD与Toast 进度条 UI其它 动画 网络相关 响应式编程 地图 数据库 图像浏览及处理 视频音频处理 测试及调试 动态更新热更新 消息推送 完整项目 插件 出名框架 其他 好的文章 收集android上开源的酷炫的交互动画和视觉