【Android 細節(二)】業務操作類的生命週期中的開始方法

來源:互聯網
上載者:User

標籤:記憶體泄露   資料庫管理   業務操作類   生命週期   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 細節(二)】業務操作類的生命週期中的開始方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.