標籤:記憶體泄露 資料庫管理 業務操作類 生命週期 start
為了防止記憶體泄露或者其他更重要的原因,為業務操作類構建生命週期是必不可少的。
即在類裡封裝onStart(),onPause(),onFinish()方法。比如我要寫一個Android中處理資料庫的業務類,他的特點是所有的資料操作是以key-value的方式儲存。
Databaser.java:
<span style="font-family:Microsoft YaHei;font-size:18px;">// 構造方法public PhoneDbAdapter(Context context) {this.mCtx = context;}// 開啟資料庫執行個體,類似於初始化public PhoneDbAdapter open() throws SQLException {mDbHelper = new DatabaseHelper(mCtx);mDb = mDbHelper.getWritableDatabase();return this;}// 關閉資料庫執行個體public void close() {mDbHelper.close();mDb.close();}// 向資料庫插入key-value值public long createPhone(String key, String value) {ContentValues initialValues = new ContentValues();initialValues.put(PHONE_KEY, key);initialValues.put(PHONE_VALUE, value);return mDb.insert(DATABASE_TABLE, null, initialValues);}// 刪除key-value值public boolean deletePhone(String key) {return mDb.delete(DATABASE_TABLE, PHONE_KEY + "=" + key, null) > 0;}// 根據查詢條件找到相應的記錄值public String fetchPhone(String key) {Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, PHONE_KEY, PHONE_VALUE }, PHONE_KEY + "='" + key+ "'", null, null, null, null, null);if (mCursor != null) {mCursor.moveToFirst();String value = mCursor.getString(mCursor.getColumnIndexOrThrow(PHONE_VALUE));mCursor.close();return value;}return null;}// 更新記錄值public boolean updatePhone(String key, String value) {ContentValues values = new ContentValues();values.put(PHONE_KEY, key);values.put(PHONE_VALUE, value);return mDb.update(DATABASE_TABLE, values, PHONE_KEY + "='" + key + "'",null) > 0;}</span>
這裡省略了重寫的建立資料庫的類SQLiteOpenHelper。
注意到open()方法中返回值為this。這裡是我以前沒有接觸到的,程式也因此出現bug。this在構造方法中的作用是代表該構造方法所建立的對象,而在執行個體方法中
代表正在調用該方法的當前對象。
問題來了,我們是否可以通過
<span style="font-family:Microsoft YaHei;font-size:18px;">Databaser d;d = d.open();</span>
來執行個體化Databaser對象呢?事實證明不可以。除非在open()方法裡new整個對象。
於是我們這樣使用這個類:
·
<span style="font-family:Microsoft YaHei;font-size:18px;">public class MainActivity extends Activity { private PhoneDbAdapter phoneDbAdapter; protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);phoneDbAdapter = new PhoneDbAdapter(this);}private String getValueByKey(String key) {phoneDbAdapter = phoneDbAdapter.open();//開啟資料庫執行個體String value = phoneDbAdapter.fetchPhoneKey(key);//根據key獲得valuephoneDbAdapter.close();//關閉資料庫管理員return value;//返回獲得的值}private void updateValueByKey(String key, String value) {try {phoneDbAdapter = phoneDbAdapter.open();//開啟資料庫執行個體phoneDbAdapter.updatePhone(key, value);//根據KEY去更新資料表中的值phoneDbAdapter.close();//關閉資料庫管理員} catch (SQLException e) {e.printStackTrace();}}}</span>
否則 phoneDbAdapter = phoneDbAdapter.open();會返回null。
這裡的關鍵是理解this在方法中所代表的含義。
在構造方法中使用this,比如:
public class People {
People ( ) {
this.init();
}
}
這裡this代表People的用該方法建立的對象。就是說該對象的建立和這個this有關。
public class TestText {
void test(){
this.x;
}
}
由於執行個體方法必須只能通過對象來調用,假如我們建立了兩個對象a和b,誰調用了這個方法,誰就是this。就是說該對象的建立和這個this無關。
謝謝~
【Android 細節(二)】業務操作類的生命週期中的開始方法