標籤:優先 載入過程 查詢 var cache 動態擷取 屬性 raw listen
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); } });
Android 開源架構 ( 四 ) Afinal --- Android 裡的 ORM IOC彙總型架構