上一篇文章講了下如何成為一個“偷懶又高效”的Android開發(fā)人員虐沥,這一篇就講講怎么樣偷懶平项,讓開發(fā)工作變得優(yōu)雅疟呐,簡單玖翅。
做android應(yīng)用開發(fā)的時候最多的場景莫過于從服務(wù)器端獲取數(shù)據(jù)翼馆,然后將數(shù)據(jù)展示在界面上,這些工作看起來復(fù)雜而繁瑣金度,實(shí)則有規(guī)律可循应媚,github上已經(jīng)有大神整理出一些快速開發(fā)的框架(如afinal,Xutils)猜极,但其實(shí)都大同小異中姜,數(shù)據(jù)庫模塊,View注解模塊,圖片處理模塊丢胚,Http請求模塊翩瓜,加上一些常用的工具類和封裝了一些通用的控件等,其實(shí)之前的文章中都或多或少的涉及到一些携龟,如ButterKnife+插件的模式兔跌,大幅度提高了效率,使用glide處理圖片等峡蟋。
聊聊緩存
根據(jù)存儲地方的不同可將緩存分為文件緩存坟桅、數(shù)據(jù)庫緩存、網(wǎng)絡(luò)緩存(存儲到服務(wù)器)蕊蝗、共享參數(shù)(SharedPreferences)仅乓、對象緩存(java bean)等,每種緩存的數(shù)據(jù)的生命周期蓬戚,安全系數(shù)都是不同夸楣,因具體情況而異,說著說著感覺緩存和文件存儲的概念很像子漩,要我說本質(zhì)上就是一個概念豫喧,只是給人的感覺略有不同。
還有一種緩存稱之為請求緩存痛单,可以減少請求服務(wù)器的次數(shù)嘿棘,說白了就設(shè)置了一個定時器劲腿,當(dāng)小于我們設(shè)定的時間就不請求后臺直接從本地緩存取旭绒,超過了時間就從服務(wù)器重新取數(shù)據(jù),目前實(shí)戰(zhàn)中還沒使用到焦人,不過還是要考慮進(jìn)去的挥吵,目前的做法是先檢查本地緩存再請求網(wǎng)絡(luò),沒有減少網(wǎng)絡(luò)請求花椭,但至少可以讓沒有網(wǎng)絡(luò)的時候界面顯示的不那么糟糕忽匈。
開始設(shè)計(jì)緩存數(shù)據(jù)庫
只需要一張表即可,將json數(shù)據(jù)作為一個字段保存而非將json數(shù)據(jù)解析完分別存入多張表(那樣的創(chuàng)建的表太多了)矿辽,如下
_id | url | data | time |
---|---|---|---|
主鍵 | 請求地址 | json數(shù)據(jù) | 時間 |
創(chuàng)建緩存數(shù)據(jù)庫和表
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "djk";
public static final int version = 1;
public static final String CACHE = "cache";
public static final String ID = "_id";
public static final String URL = "url";
public static final String DATA = "data";
public static final String TIME = "time";
public DBHelper(Context context) {
super(context, DBNAME, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE IF NOT EXISTS "
+ CACHE + " ("
+ ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ URL + " TEXT, "
+ TIME + " TEXT, "
+ DATA + " TEXT)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}~~~
數(shù)據(jù)庫操作管理,
public class DBManager {
private SQLiteDatabase db;
private DBHelper dbHelper;
public DBManager() {
dbHelper = new DBHelper(App.getContext());
}
/**
* 插入緩存,沒有就插入钞钙,有就替換
*
* @param url 地址
* @param data json數(shù)據(jù)
*/
public synchronized void insertData(String url, String data) {
db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(DBHelper.URL, url);
values.put(DBHelper.DATA, data);
values.put(DBHelper.TIME, System.currentTimeMillis());
db.replace(DBHelper.CACHE, null, values);
db.close();
}
/**
* 根據(jù)url獲取緩存數(shù)據(jù)
*
* @param url 地址
* @return 數(shù)據(jù)
*/
public synchronized String getData(String url) {
String result = "";
db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM " + DBHelper.CACHE + " WHERE URL = ?", new String[]{url});
while (cursor.moveToNext()) {
result = cursor.getString(cursor.getColumnIndex(DBHelper.DATA));
}
cursor.close();
db.close();
return result;
}
}~~~
使用
雖然請求的框架有所不同诅岩,但是大致方式是一致的,在封裝請求框架時注意要返回String類型宾娜,比如使用volley批狐,要用StringRequest,將返回的數(shù)據(jù)存入數(shù)據(jù)庫前塔,在請求之前可檢查是否存在緩存即可嚣艇,可通過參數(shù)控制是否要緩存數(shù)據(jù)承冰,另外time字段可作為緩存失效的依據(jù),數(shù)據(jù)解析的方式是一樣的食零,無非是一個來自后臺數(shù)據(jù)庫困乒,一個取自本地數(shù)據(jù)庫。
第三方請求框架使用的時候最好先封裝下再用慌洪,結(jié)合具體的業(yè)務(wù)場景可寫出更簡潔的代碼顶燕,也方便日后維護(hù)擴(kuò)展。
另外冈爹,我計(jì)劃利用業(yè)余的時間寫一個小項(xiàng)目GanK(使用了干貨集中營的數(shù)據(jù)),上面講到的一些技巧會在項(xiàng)目中體現(xiàn)出來涌攻,歡迎大家關(guān)注。
關(guān)于之前寫的一篇文章自己造輪子--android常用多條件篩選菜單實(shí)現(xiàn)思路(類似美團(tuán)频伤,愛奇藝電影票下拉菜單)中提到一些改進(jìn)的想法恳谎,我已經(jīng)完成了部分,我后面會盡量抽時間將它完善憋肖,快過年了因痛,前天我正式辭掉了目前的工作(也是我的第一份正式工作),明年又是一個新的開始岸更,加油M腋唷!同時在這里給大家拜個早年怎炊,新年快樂L菲蟆!