xUtils一個Android公共庫框架,主要包括四個部分:View,Db, Http, Bitmap 四個模塊。 java
流程和關係較少, 請看下面的詳細分析 android
註解和反射知識是這個模塊的主要內容 git
View和各類事件的注入以及資源的注入。 github
private static void injectObject(Object handler, ViewFinder finder)
第一個參數Object handler表明的是須要注入的對象, 第二個參數是須要注入View(這個View就是handler的成員變量)所在的View或者Activity的包裝對象。 該方法完成了View和各類事件的注入以及資源的注入。主要的原理就是經過反射和註解。 sql
public View findViewById(int id, int pid) public View findViewById(int id)
若是存在父View, 優先從父View尋找,不然從當前的View或者Activity中尋找。 數據庫
public static Object loadRes(ResType type, Context context, int id)
獲取資源文件值。支持多種資源的獲取。 apache
事件的注入, 其中的設計是經過動態代理。 api
private final static DoubleKeyValueMap<ViewInjectInfo, Class<?>, Object> listenerCache = new DoubleKeyValueMap<ViewInjectInfo, Class<?>, Object>();
存放監聽事件接口map。 由於有些接口有多個函數, 代理會判斷事件接口是否存在, 若是存在只增長代理方法就夠了, 避免從新設置監聽事件接口。 緩存
public static void addEventMethod( ViewFinder finder, ViewInjectInfo info, Annotation eventAnnotation, Object handler, Method method)
代理監聽事件 服務器
流程和關係較少, 請看下面的詳細分析
註解、反射和數據庫操做知識這個模塊的主要內容
主要功能數據庫的建立,數據庫的增刪改查。
private static HashMap<String, DbUtils> daoMap = new HashMap<String, DbUtils>();
存放DbUtils實例對象的map,每一個數據庫對應一個實例, key爲數據庫的名稱。
private synchronized static DbUtils getInstance(DaoConfig daoConfig)
採起的是單例模式,根據DaoConfig建立數據庫, 中間還涉及到數據庫升級。
delete; findAll; findById; saveOrUpdate;// 當數據庫沒有時保存, 存在時修改。 update;
增刪改查。
private String dbName = "xUtils.db"; // default db name數據庫名稱 private int dbVersion = 1; //數據庫版本 private DbUpgradeListener dbUpgradeListener; //升級監聽事件
數據庫配置類。
在DbUtils的查詢數據中
@SuppressWarnings("unchecked") public <T> List<T> findAll(Selector selector) throws DbException { .... String sql = selector.toString(); long seq = CursorUtils.FindCacheSequence.getSeq(); findTempCache.setSeq(seq); Object obj = findTempCache.get(sql);//優先從緩存讀取 if (obj != null) { return (List<T>) obj; } ... }
數據庫查詢數據的緩存。在查詢中會優先調用緩存中的數據
sql建表、增刪改語句的組合。
public static SqlInfo buildCreateTableSqlInfo(DbUtils db, Class<?> entityType) public static SqlInfo buildDeleteSqlInfo(DbUtils db, Class<?> entityType, Object idValue) public static SqlInfo buildDeleteSqlInfo(DbUtils db, Class<?> entityType, WhereBuilder whereBuilder) public static SqlInfo buildDeleteSqlInfo(DbUtils db, Object entity) public static SqlInfo buildInsertSqlInfo(DbUtils db, Object entity) public static SqlInfo buildUpdateSqlInfo(DbUtils db, Object entity, String... updateColumnNames) public static SqlInfo buildUpdateSqlInfo(DbUtils db, Object entity, WhereBuilder whereBuilder, String... updateColumnNames)
sql語句和值包裝對象。
表對象。
表中列對象。
表對應的主鍵對象。
sql查詢語句的組合。
sql條件語句的組合。
支持異步同步訪問網絡數據, 斷點下載文件。
//網絡數據的緩存。 public final static HttpCache sHttpCache = new HttpCache(); //訪問網絡的HttpClient。 private final DefaultHttpClient httpClient; private final HttpContext httpContext = new BasicHttpContext(); //線程池。 private final static PriorityExecutor EXECUTOR = new PriorityExecutor(DEFAULT_POOL_SIZE);
public HttpUtils(int connTimeout, String userAgent) { //配置超時時間,UserAgent, http版本信息協議等一些信息 ..... //將配置的參數統一放到httpClient中 httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager(params, schemeRegistry), params); .... //下面這個關鍵,設置攔截器。 默認加上gizp壓縮。 經過gizp壓縮後的數據傳輸效率高不少。 httpClient.addRequestInterceptor(new HttpRequestInterceptor() { @Override public void process(org.apache.http.HttpRequest httpRequest, HttpContext httpContext) throws org.apache.http.HttpException, IOException { if (!httpRequest.containsHeader(HEADER_ACCEPT_ENCODING)) { httpRequest.addHeader(HEADER_ACCEPT_ENCODING, ENCODING_GZIP); } } }); httpClient.addResponseInterceptor(new HttpResponseInterceptor() { @Override public void process(HttpResponse response, HttpContext httpContext) throws org.apache.http.HttpException, IOException { final HttpEntity entity = response.getEntity(); if (entity == null) { return; } final Header encoding = entity.getContentEncoding(); if (encoding != null) { for (HeaderElement element : encoding.getElements()) { if (element.getName().equalsIgnoreCase("gzip")) { //這裏判斷從服務器傳輸的數據是否須要經過gzip解壓。 response.setEntity(new GZipDecompressingEntity(response.getEntity())); return; } } } } }); }
//訪問網絡數據 private <T> HttpHandler<T> sendRequest(HttpRequest request, RequestParams params, RequestCallBack<T> callBack); //下載網絡文件 public HttpHandler<File> download(HttpRequest.HttpMethod method, String url, String target, RequestParams params, boolean autoResume, boolean autoRename, RequestCallBack<File> callback);
網絡請求的包裝類。 包括url, 訪問請求方法, 參數值等。
完成數據請求回調接口。
獲取網絡數據邏輯的實現。這裏能夠理解爲系統內部AsyncTask。 訪問網絡數據處理流程圖
網絡數據的緩存,內部包含LruMemoryCache。在獲取數據的時候會判斷是否過時。
handleEntity()將網絡io流轉化爲String。
handleEntity()將網絡io流轉化爲File。
統一異常
請查看http模塊
圖片的異步加載,支持本地和網絡圖片, 圖片的壓縮處理, 圖片的內存緩存已經本地緩存。
private BitmapGlobalConfig globalConfig; // 線程池,緩存,和網絡的配置 private BitmapDisplayConfig defaultDisplayConfig; //圖片顯示的配置
/** * @param container 表示須要顯示圖片的View * @param uri 圖片的uri * @param displayConfig 圖片顯示的配置 * @param callBack 圖片加載的回調接口 */ public <T extends View> void display(T container, String uri, BitmapDisplayConfig displayConfig, BitmapLoadCallBack<T> callBack)
設置圖片流程圖
詳細流程圖
加載圖片的異步任務。在doInBackground中讀取圖片資源
private LruDiskCache mDiskLruCache; //閃存緩存 private LruMemoryCache<MemoryCacheKey, Bitmap> mMemoryCache; //運存緩存
//下載網絡圖片, 而後根據配置壓縮圖片, 將圖片緩存。 public Bitmap downloadBitmap(String uri, BitmapDisplayConfig config, final BitmapUtils.BitmapLoadTask<?> task) //從運存緩存中讀取bitmap 在獲取的時候會判斷是否過時 public Bitmap getBitmapFromMemCache(String uri, BitmapDisplayConfig config) //從閃存緩存中讀取bitmap public Bitmap getBitmapFromDiskCache(String uri, BitmapDisplayConfig config)
配置, 包括線程池, 緩存的大小。
//閃存緩存的路徑 private String diskCachePath; //運存緩存的最大值 private int memoryCacheSize = 1024 * 1024 * 4; // 4MB //閃存緩存的最大值 private int diskCacheSize = 1024 * 1024 * 50; // 50M //從網絡加載數據的線程池 private final static PriorityExecutor BITMAP_LOAD_EXECUTOR = new PriorityExecutor(DEFAULT_POOL_SIZE); //從閃存讀取數據的線程池 private final static PriorityExecutor DISK_CACHE_EXECUTOR = new PriorityExecutor(2); //bitmap緩存的的時間 private long defaultCacheExpiry = 1000L * 60 * 60 * 24 * 30; // 30 days //bitmap緩存 private BitmapCache bitmapCache;
//圖片顯示的大小 private BitmapSize bitmapMaxSize; //圖片的動畫 private Animation animation; // 圖片加載過程當中的顯示圖片 private Drawable loadingDrawable; // 圖片加載失敗的顯示圖片 private Drawable loadFailedDrawable; // 圖片顯示的配置色彩 private Bitmap.Config bitmapConfig = Bitmap.Config.RGB_565;
獲取bitmap, 支持三種獲取路徑, 本地文件,資產文件, 和網絡圖片。
圖片加載完成的的回調, 默認回調將獲取的bitmap值傳遞給view。
和Volley框架相比