Android 開源架構 ( 四 ) Afinal --- Android 裡的 ORM IOC彙總型架構

來源:互聯網
上載者:User

標籤:優先   載入過程   查詢   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彙總型架構

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.