位置: 編程技術(shù) - 正文
推薦整理分享開源項(xiàng)目源碼解析-xUtils 源碼解析(開源項(xiàng)目怎么做),希望有所幫助,僅作參考,歡迎閱讀內(nèi)容。
文章相關(guān)熱門搜索詞:開源的項(xiàng)目是什么意思,開源項(xiàng)目介紹,開源項(xiàng)目有什么用,開源項(xiàng)目怎么做,開源項(xiàng)目源碼解決方案,開源項(xiàng)目代碼,開源項(xiàng)目源碼解決方案,開源項(xiàng)目源碼解決方案,內(nèi)容如對您有幫助,希望把文章鏈接給更多的朋友!
本文為 Android 開源項(xiàng)目源碼解析 中 xUtils 部分。項(xiàng)目地址:xUtils,分析的版本:c2ac,Demo 地址:xUtils Demo分析者:Caij,校對者:maogy,校對狀態(tài):未完成
1. 功能介紹xUtils一個(gè)Android公共庫框架,主要包括四個(gè)部分:View,Db, Http, Bitmap 四個(gè)模塊。
View模塊主要的功能是通過注解綁定UI,資源,事件。Db模塊是一個(gè)數(shù)據(jù)庫orm框架, 簡單的語句就能進(jìn)行數(shù)據(jù)的操作。Http模塊主要訪問網(wǎng)絡(luò),支持同步,異步方式的請求,支持文件的下載。Bitmap模塊是加載圖片以及圖片的處理, 支持加載本地,網(wǎng)絡(luò)圖片。而且支持圖片的內(nèi)存和本地緩存。2. 詳細(xì)設(shè)計(jì)2.1 View模塊2.1.1 總體設(shè)計(jì)流程和關(guān)系較少, 請看下面的詳細(xì)分析
2.1.2 流程圖2.1.3 核心類功能介紹請先了解注解 ,動態(tài)代理 可以幫助到您, 如果已經(jīng)了解請忽略。注解和反射知識是這個(gè)模塊的主要內(nèi)容
1.ViewUtils.javaView和各種事件的注入以及資源的注入。
(1)主要函數(shù)第一個(gè)參數(shù)Object handler代表的是需要注入的對象, 第二個(gè)參數(shù)是需要注入View(這個(gè)View就是handler的成員變量)所在的View或者Activity的包裝對象。該方法完成了View和各種事件的注入以及資源的注入。主要的原理就是通過反射和注解。
完成Activity的setContentView。完成View的注入。完成資源的注入。完成各種事件的注入。2.ViewFinder.java(1)主要函數(shù)如果存在父View, 優(yōu)先從父View尋找,否則從當(dāng)前的View或者Activity中尋找。
3.ResLoader.java獲取資源文件。支持多種資源的獲取。
4.EventListenerManager.java事件的注入, 其中的設(shè)計(jì)是通過動態(tài)代理。
存放監(jiān)聽事件接口map。 因?yàn)橛行┙涌谟卸鄠€(gè)函數(shù), 代理會判斷事件接口是否存在, 如果存在只增加代理方法就夠了, 避免重新設(shè)置監(jiān)聽事件接口。
代理監(jiān)聽事件
5.注解類2.2 Db模塊2.2.1 總體設(shè)計(jì)流程和關(guān)系較少, 請看下面的詳細(xì)分析
2.2.2 流程圖2.2.3 核心類功能介紹注解、反射和數(shù)據(jù)庫操作知識這個(gè)模塊的主要內(nèi)容
1.DbUtils.java主要功能數(shù)據(jù)庫的創(chuàng)建,數(shù)據(jù)庫的增刪改查。
存放DbUtils實(shí)例對象的map,每個(gè)數(shù)據(jù)庫對應(yīng)一個(gè)實(shí)例, key為數(shù)據(jù)庫的名稱。
采取的是單例模式,根據(jù)DaoConfig創(chuàng)建數(shù)據(jù)庫, 中間還涉及到數(shù)據(jù)庫升級。
增刪改查。
2.DaoConfig.java數(shù)據(jù)庫配置類。
3.FindTempCache.java在DbUtils的查詢數(shù)據(jù)中
數(shù)據(jù)庫查詢數(shù)據(jù)的緩存。在查詢中會優(yōu)先調(diào)用緩存中的數(shù)據(jù)
4.SqlInfoBuilder.javasql建表、增刪改語句的組合。
5.SqlInfo.javasql語句和包裝對象。
6.Table.java表對象。
7.Column.java表中列對象。
8.Id.java表對應(yīng)的主鍵對象。
9.Selector.javasql查詢語句的組合。
.WhereBuilder.javasql條件語句的組合。
DBUtils增刪改查:
操縱數(shù)據(jù)庫的工具類,無論多牛X,總離不開最根本的CRUD,即創(chuàng)建,查詢,更新和刪除。下面從這四個(gè)角度依次介紹xUtils是如何簡便持久化數(shù)據(jù)的。大家都知道,在Android里面如果要存儲一個(gè)對象,我們需要?jiǎng)?chuàng)建一個(gè)SQLiteOpenHelper,然后還得創(chuàng)建一張對應(yīng)對象各個(gè)屬性的表,還得繼續(xù)把我們的對象轉(zhuǎn)換成ContentValues,進(jìn)而去存儲。真心是麻煩的不能再麻煩了,我們現(xiàn)在介紹的DbUtils就能讓你輕松解脫麻繩一樣的代碼。DbUtils在進(jìn)行save操作的時(shí)候,會根據(jù)java反射反射出對象的各個(gè)字段,然后去查詢數(shù)據(jù)庫中是否存在這個(gè)對象類型對應(yīng)的表,如果表已經(jīng)存在,直接進(jìn)行插入操作;如果不存在,就先動態(tài)的創(chuàng)建的一張對應(yīng)我們對象的表,再進(jìn)行插入處理。直接上代碼,大家看。
[java] view plaincopy@OnClick(R.id.insert) public void insert(View v) { Student stu = null; for (int i = 0; i < ; i) { stu = new Student(); stu.setAge( i); stu.setName("jack" i); mList.add(stu); try { dbUtils.save(stu); } catch (DbException e) { e.printStackTrace(); } } } 注意:并不是所有的實(shí)體對象都快可以通過這種方式去存儲,一定要保證對象的類型中有int類型的id或者_(dá)id的屬性,這就對應(yīng)數(shù)據(jù)庫表中的主鍵字段。如果類型中沒有id字段,可以通過@Id注解去指定一個(gè)int類型的字段作為主鍵。如果表中的又字段不想被存儲在數(shù)據(jù)庫中,也可以通過@Transient去實(shí)現(xiàn)忽略。如果直接存儲一個(gè)對象的列表,這樣也是被允許的,達(dá)到批量存儲的目的。DbUtils可以幫助對SQL語句不是很熟悉的同學(xué)快速的實(shí)現(xiàn)查詢,而不用去寫sql查詢語句,而且可以對查詢結(jié)果進(jìn)行排序和分頁,使用簡單,功能強(qiáng)大。大家可以看下,下面的幾行代碼就能實(shí)現(xiàn)復(fù)雜的查詢功能
[java] view plaincopydbUtils.findAll(Selector.from(Student.class) .where("_id", "<", ).and("age", ">", ).orderBy("_id") .limit(pageSize).offset(pageSize * pageIndex)); 同樣的,也可以對數(shù)據(jù)庫中得數(shù)據(jù)進(jìn)行便捷的更新。下面演示的是更新Student對應(yīng)的表中的第一條記錄的age這個(gè)字段。這個(gè)比較簡單,就直接上代碼看吧。[java] view plaincopy@OnClick(R.id.update) public void update(View v){ try { List<Student> stus = dbUtils.findAll(Selector.from(Student.class)); Student stu = stus.get(0); stu.setAge(); dbUtils.update(stu); } catch (DbException e) { e.printStackTrace(); } } 最后一個(gè)就是數(shù)據(jù)的刪除。一個(gè)實(shí)體對象,一組實(shí)體對象,根據(jù)條件刪除,刪除表,刪除整個(gè)數(shù)據(jù)庫,這些操作都可以通過一句簡單的代碼來實(shí)現(xiàn),看了代碼就明白了。[java] view plaincopy@OnClick(R.id.delete) public void delete(View v){ try { List<Student> stus = dbUtils.findAll(Selector.from(Student.class)); dbUtils.delete(stus.get(0)); dbUtils.deleteAll(stus); dbUtils.deleteById(Student.class, WhereBuilder.b("age", "==", )); dbUtils.dropTable(Student.class); dbUtils.dropDb(); } catch (DbException e) { e.printStackTrace(); } } 2.3 Http模塊2.3.1 總體設(shè)計(jì)2.3.2 流程圖2.3.3 類圖1.HttpUtils.java支持異步同步訪問網(wǎng)絡(luò)數(shù)據(jù), 斷點(diǎn)下載文件。
2.HttpRequest.java網(wǎng)絡(luò)請求的包裝類。 包括url, 訪問請求方法, 參數(shù)等。
3.RequestCallBack.java完成數(shù)據(jù)請求回調(diào)接口。
4.HttpHandler.java獲取網(wǎng)絡(luò)數(shù)據(jù)邏輯的實(shí)現(xiàn)。這里可以理解為系統(tǒng)內(nèi)部AsyncTask。訪問網(wǎng)絡(luò)數(shù)據(jù)處理流程圖
5.HttpCache.java網(wǎng)絡(luò)數(shù)據(jù)的緩存,內(nèi)部包含LruMemoryCache。在獲取數(shù)據(jù)的時(shí)候會判斷是否過期。
6.StringDownLoadHandler.javahandleEntity()將網(wǎng)絡(luò)io流轉(zhuǎn)化為String。
7.FileDownLoadHandler.javahandleEntity()將網(wǎng)絡(luò)io流轉(zhuǎn)化為File。
8.HttpException.java統(tǒng)一異常
2.4 Bitmap模塊2.4.1 總體設(shè)計(jì)2.4.2 流程圖請查看http模塊
2.4.3 類圖1.BitmapUtils.java圖片的異步加載,支持本地和網(wǎng)絡(luò)圖片, 圖片的壓縮處理, 圖片的內(nèi)存緩存已經(jīng)本地緩存。
設(shè)置圖片流程圖
詳細(xì)流程圖
2.BitmapLoadTask.java加載圖片的異步任務(wù)。在doInBackground中讀取圖片資源
3.BitmapCache.java(1)主要函數(shù)4.BitmapGlobalConfig.java配置, 包括線程池, 緩存的大小。
5.BitmapDisplayConfig.java6.DefaultDownloader.java獲取bitmap, 支持三種獲取路徑, 本地文件,資產(chǎn)文件, 和網(wǎng)絡(luò)圖片。
7.DefaultBitmapLoadCallBack.java圖片加載完成的的回調(diào), 默認(rèn)回調(diào)將獲取的bitmap傳遞給view。
3. 雜談和Volley框架相比
相同點(diǎn):1.采用了網(wǎng)絡(luò)數(shù)據(jù)緩存機(jī)制。2.通過handler進(jìn)行線程通信不同點(diǎn):Volley的Http請求在 android 2.3 版本之前是通過HttpClient ,在之后的版本是通過URLHttpConnection。xUtils都是通過HttpClient請求網(wǎng)絡(luò)(bitmap模塊圖片下載是通過URLHttpConnection)。 URLHttpConnection默認(rèn)支持GZIP壓縮,api操作簡單。2.Volley將Http請求數(shù)據(jù)先緩存進(jìn)byte[], 然后是分配給不同的請求轉(zhuǎn)化為需要的式。xUtils是直接轉(zhuǎn)化為想要的式。 Volley:擴(kuò)展性好, 但是不能存在大數(shù)據(jù)請求,否則就OOM。xUtils:不緩存入byte[] 支持大數(shù)據(jù)的請求, 速度比Volley稍快,但擴(kuò)展性就低。4.Volley訪問網(wǎng)絡(luò)數(shù)據(jù)時(shí)直接開啟固定個(gè)數(shù)線程訪問網(wǎng)絡(luò), 在run方法中執(zhí)行死循環(huán), 阻塞等待請求隊(duì)列。 xUtils是開啟線程池來管理線程。緩存失效策略, volley的所有網(wǎng)絡(luò)數(shù)據(jù)支持從http響應(yīng)頭中控制是否緩存和讀取緩存失效時(shí)間,每個(gè)請求可以控制是否緩存和緩存失效時(shí)間。 Xutils網(wǎng)絡(luò)數(shù)據(jù)請求是統(tǒng)一自定義緩存失效時(shí)間。掌握Activity 的生命周期(Lifecycle) Activity的生命周期(Lifecycle)在用戶與App進(jìn)行交互,開啟APP,退出APP,按Home鍵回到桌面等等的時(shí)候,相關(guān)的Activity實(shí)例將會不斷的切換Activity生命周期中
android開發(fā)之單點(diǎn)觸摸 相對于多點(diǎn)觸摸,單點(diǎn)觸摸還是很簡單的。新建一個(gè)工程,先看看布局文件:RelativeLayoutxmlns:android="
Android 添加數(shù)據(jù)到本地Excel表中 由于項(xiàng)目需要,今天學(xué)習(xí)了一下如何將程序里的數(shù)據(jù)添加到本地的Excel表中。下面為學(xué)習(xí)筆記:先上效果圖:首先,需要導(dǎo)入jxl.jar包到libs文件夾內(nèi)。然后
標(biāo)簽: 開源項(xiàng)目怎么做
本文鏈接地址:http://esstyw.cn/biancheng/382243.html 轉(zhuǎn)載請保留說明!上一篇:Android屬性動畫完全解析(上),初識屬性動畫的基本用法(android 屬性動畫原理)
網(wǎng)站地圖: 企業(yè)信息 工商信息 財(cái)稅知識 網(wǎng)絡(luò)常識 編程技術(shù)
友情鏈接: 武漢網(wǎng)站建設(shè)