{"id":13452715,"url":"https://github.com/yangfuhai/afinal","last_synced_at":"2025-05-15T03:07:52.093Z","repository":{"id":5095066,"uuid":"6257984","full_name":"yangfuhai/afinal","owner":"yangfuhai","description":"Afinal是一个android的ioc，orm框架，内置了四大模块功能：FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity，我们可以通过注解的方式进行绑定ui和事件。通过finalBitmap，我们可以方便的加载bitmap图片，而无需考虑oom等问题。通过finalDB模块，我们一行代码就可以对android的sqlite数据库进行增删改查。通过FinalHttp模块，我们可以以ajax形式请求http数据。详情请通过以下网址查看。","archived":false,"fork":false,"pushed_at":"2017-05-24T13:40:35.000Z","size":4234,"stargazers_count":3149,"open_issues_count":63,"forks_count":1483,"subscribers_count":424,"default_branch":"master","last_synced_at":"2025-04-14T03:09:44.030Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yangfuhai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-10-17T08:10:00.000Z","updated_at":"2025-03-22T03:59:44.000Z","dependencies_parsed_at":"2022-09-04T18:22:40.892Z","dependency_job_id":null,"html_url":"https://github.com/yangfuhai/afinal","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yangfuhai%2Fafinal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yangfuhai%2Fafinal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yangfuhai%2Fafinal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yangfuhai%2Fafinal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yangfuhai","download_url":"https://codeload.github.com/yangfuhai/afinal/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254264769,"owners_count":22041794,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T08:00:21.180Z","updated_at":"2025-05-15T03:07:47.078Z","avatar_url":"https://github.com/yangfuhai.png","language":"Java","funding_links":[],"categories":["Java","数据库开发","Libs"],"sub_categories":["\u003cA NAME=\"Framework\"\u003e\u003c/A\u003eFramework"],"readme":"#afinal交流平台\n* QQ群：192341294（群1，2000未满）    246710918（群2，1000未满）\n##作者个人微信\n![mahua](http://7xi3g2.com1.z0.glb.clouddn.com/grwx.png?imageView2/1/w/250/h/250/q/87)\n\n\n----\n# ![mahua](http://code.google.com/p/afinal/logo?cct=1351516535) Afinal简介 \n* Afinal 是一个android的sqlite orm 和 ioc 框架。同时封装了android中的http框架，使其更加简单易用；\n* 使用finalBitmap，无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题。\n* Afinal的宗旨是简洁，快速。约定大于配置的方式。尽量一行代码完成所有事情。\n\n\n##目前Afinal主要有四大模块：\n\n* FinalDB模块：android中的orm框架，一行代码就可以进行增删改查。支持一对多，多对一等查询。\n\n* FinalActivity模块：android中的ioc框架，完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。\n\n* FinalHttp模块：通过httpclient进行封装http数据请求，支持ajax方式加载。\n\n* FinalBitmap模块：通过FinalBitmap，imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。FinalBitmap可以配置线程加载线程数量，缓存大小，缓存路径，加载显示动画等。FinalBitmap的内存管理使用lru算法，没有使用弱引用（android2.3以后google已经不建议使用弱引用，android2.3后强行回收软引用和弱引用，详情查看android官方文档），更好的管理bitmap内存。FinalBitmap可以自定义下载器，用来扩展其他协议显示网络图片，比如ftp等。同时可以自定义bitmap显示器，在imageview显示图片的时候播放动画等（默认是渐变动画显示）。\n\n\n---\n## 使用afinal快速开发框架需要有以下权限：\n\n```xml\n\u003cuses-permission android:name=\"android.permission.INTERNET\" /\u003e\n\u003cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" /\u003e\n```\n* 第一个是访问网络\n* 第二个是访问sdcard\n* 访问网络是请求网络图片的时候需要或者是http数据请求时候需要，访问sdcard是图片缓存的需要。\n\n----\n##FinalDB使用方法：\n关于finalDb的更多介绍，请点击[这里](http://my.oschina.net/yangfuhai/blog/87459)\n\n```java\nFinalDb db = FinalDb.create(this);\nUser user = new User(); //这里需要注意的是User对象必须有id属性，或者有通过@ID注解的属性\nuser.setEmail(\"mail@tsz.net\");\nuser.setName(\"michael yang\");\ndb.save(user);\n```\n\n----\n##FinalDB OneToMany懒加载使用方法：\n模型定义：\n```java\npublic class Parent{\n    private int id;\n    @OneToMany(manyColumn = \"parentId\")\n    private OneToManyLazyLoader\u003cParent ,Child\u003e children;\n    /*....*/\n}\npublic class Child{\n    private int id;\n    private String text;\n    @ManyToOne(column = \"parentId\")\n    private  Parent  parent;\n    /*....*/\n}\n```\n使用：\n```java\nList\u003cParent\u003e all = db.findAll(Parent.class);\n        for( Parent  item : all){\n            if(item.getChildren ().getList().size()\u003e0)\n                Toast.makeText(this,item.getText() + item.getChildren().getList().get(0).getText(),Toast.LENGTH_LONG).show();\n        }\n```\n----\n##FinalActivity使用方法：\n* 完全注解方式就可以进行UI绑定和事件绑定\n* 无需findViewById和setClickListener等\n\n```java\npublic class AfinalDemoActivity extends FinalActivity {\n\n    //无需调用findViewById和setOnclickListener等\n    @ViewInject(id=R.id.button,click=\"btnClick\") Button button;\n    @ViewInject(id=R.id.textView) TextView textView;\n\n    public void onCreate(Bundle savedInstanceState) {\n       super.onCreate(savedInstanceState);\n       setContentView(R.layout.main);\n    }\n    \n    public void btnClick(View v){\n       textView.setText(\"text set form button\");\n    }\n}\n```\n*在其他侵入式框架下使用（如ActionBarShelock）\n```java\n     protected void onCreate(Bundle savedInstanceState) {\n       super.onCreate(savedInstanceState);\n        setContentView(view);\n        FinalActivity.initInjectedView(this);\n     }\n```\n*在Fragment中使用\n```java\n     public View onCreateView(LayoutInflater inflater, ViewGroup container,\n          Bundle savedInstanceState) {\n       View viewRoot = inflater.inflate(R.layout.map_frame, container, false);\n       FinalActivity.initInjectedView(this,viewRoot);\n    }\n```\n##FinalHttp使用方法：\n###普通get方法\n\n```java\nFinalHttp fh = new FinalHttp();\nfh.get(\"http://www.yangfuhai.com\", new AjaxCallBack(){\n\n    @Override\n    public void onLoading(long count, long current) { //每1秒钟自动被回调一次\n        \ttextView.setText(current+\"/\"+count);\n\t}\n\n\t@Override\n\tpublic void onSuccess(String t) {\n\t\t\ttextView.setText(t==null?\"null\":t);\n\t}\n\n\t@Override\n\tpublic void onStart() {\n\t\t//开始http请求的时候回调\n\t}\n\n\t@Override\n\tpublic void onFailure(Throwable t, String strMsg) {\n\t\t//加载失败的时候回调\n\t}\n});\n```\n\n### 使用FinalHttp上传文件 或者 提交数据 到服务器（post方法）\n文件上传到服务器，服务器如何接收，请查看[这里](http://www.oschina.net/question/105836_85825)\n\n```java\n  AjaxParams params = new AjaxParams();\n  params.put(\"username\", \"michael yang\");\n  params.put(\"password\", \"123456\");\n  params.put(\"email\", \"test@tsz.net\");\n  params.put(\"profile_picture\", new File(\"/mnt/sdcard/pic.jpg\")); // 上传文件\n  params.put(\"profile_picture2\", inputStream); // 上传数据流\n  params.put(\"profile_picture3\", new ByteArrayInputStream(bytes)); // 提交字节流\n \n  FinalHttp fh = new FinalHttp();\n  fh.post(\"http://www.yangfuhai.com\", params, new AjaxCallBack(){\n  \t\t@Override\n \t\tpublic void onLoading(long count, long current) {\n \t\t\t\ttextView.setText(current+\"/\"+count);\n \t\t}\n \n \t\t@Override\n \t\tpublic void onSuccess(String t) {\n \t\t\ttextView.setText(t==null?\"null\":t);\n \t\t}\n  });\n```\n\n\n----\n\n###使用FinalHttp下载文件：\n* 支持断点续传，随时停止下载任务 或者 开始任务\n\n```java\n    FinalHttp fh = new FinalHttp();  \n    //调用download方法开始下载\n    HttpHandler handler = fh.download(\"http://www.xxx.com/下载路径/xxx.apk\", //这里是下载的路径\n    true,//true:断点续传 false:不断点续传（全新下载）\n    \"/mnt/sdcard/testapk.apk\", //这是保存到本地的路径\n    new AjaxCallBack() {  \n                @Override  \n                public void onLoading(long count, long current) {  \n                     textView.setText(\"下载进度：\"+current+\"/\"+count);  \n                }  \n  \n                @Override  \n                public void onSuccess(File t) {  \n                    textView.setText(t==null?\"null\":t.getAbsoluteFile().toString());  \n                }  \n  \n            });  \n\n\t\n   //调用stop()方法停止下载\n   handler.stop();\n\n   \n```\n\n\n##FinalBitmap 使用方法 \n加载网络图片就一行代码 fb.display(imageView,url) ,更多的display重载请看[帮助文档](https://github.com/yangfuhai/afinal/tree/master/doc)\n\n```java\nprivate GridView gridView;\n\tprivate FinalBitmap fb;\n\t@Override\n\tprotected void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\tsetContentView(R.layout.images);\n\t\t\n\t\tgridView = (GridView) findViewById(R.id.gridView);\n\t\tgridView.setAdapter(mAdapter);\n\t\t\n\t\tfb = FinalBitmap.create(this);//初始化FinalBitmap模块\n\t\tfb.configLoadingImage(R.drawable.downloading);\n\t\t//这里可以进行其他十几项的配置，也可以不用配置，配置之后必须调用init()函数,才生效\n\t\t//fb.configBitmapLoadThreadSize(int size)\n\t\t//fb.configBitmapMaxHeight(bitmapHeight)\n\t}\n\n\n///////////////////////////adapter getView////////////////////////////////////////////\n\npublic View getView(int position, View convertView, ViewGroup parent) {\n\tImageView iv;\n\tif(convertView == null){\n\t    convertView = View.inflate(BitmapCacheActivity.this,R.layout.image_item, null);\n\t    iv = (ImageView) convertView.findViewById(R.id.imageView);\n\t    iv.setScaleType(ScaleType.CENTER_CROP);\n\t    convertView.setTag(iv);\n\t}else{\n\t    iv = (ImageView) convertView.getTag();\n\t}\n\t//bitmap加载就这一行代码，display还有其他重载，详情查看源码\n\tfb.display(iv,Images.imageUrls[position]);\n```\n\n\n---\n**\u003e\u003e\u003e Add by fantouch**\n\n#### 配置成Android Library Project\n*解决需求:有多个项目依赖afinal,并且想修改afinal源码*\n\u003e  \n* clone到本地\n* 添加AndroidManifest.xml文件:\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cmanifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"net.tsz.afinal\" \u003e\n    \u003cuses-sdk\n        android:minSdkVersion=\"5\"\n        android:targetSdkVersion=\"7\" /\u003e\n\u003c/manifest\u003e\n```\n\u003e  \n* 导入到 Eclipse:  \n`Import =\u003e Android =\u003e Existing Android Code Into Workspace`\n* 工程上按右键 =\u003e Properties =\u003e Android =\u003e √ Is Library\n* 完成,你的项目可以引用这个afinal Library了.\n\n#### 排除不需要Git管理的文件\n*解决需求:想修改源码,但不想让Eclipse把工程弄脏*\n\u003e  \n* 忽略已经被Git管理的`./bin`目录:  \n导入Eclipse前执行:  ` git update-index --assume-unchanged ./bin/* `\n\u003e  \n* 忽略未被Git管理的文件和目录: 添加`/.gitignore` 文件:  \n```\n/gen\n/assets\n/bin\n/res\n/.classpath\n/.project\n/AndroidManifest.xml\n/project.properties\n/.gitignore\n```  \n* 导入到Eclipse,`git status`可见Repository依旧干净.\n  \n**\u003c\u003c\u003c Add by fantouch**\n\n---\n\n#关于作者michael\n* 个人博客：[http://www.yangfuhai.com](http://www.yangfuhai.com)\n* afinal捐助：[http://me.alipay.com/yangfuhai](http://me.alipay.com/yangfuhai) （为了感谢捐助者，michael将会把捐助者将公布在afinal官方网站上,不让公布的同学说明下）\n* afinal交流QQ群 ： 192341294\n#个人微信\n![mahua](http://7xi3g2.com1.z0.glb.clouddn.com/grwx.png?imageView2/1/w/250/h/250/q/87)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyangfuhai%2Fafinal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyangfuhai%2Fafinal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyangfuhai%2Fafinal/lists"}