当前位置: 代码迷 >> Android >> 【Android 细节(2)】业务操作类的生命周期中的开始方法
  详细解决方案

【Android 细节(2)】业务操作类的生命周期中的开始方法

热度:58   发布时间:2016-04-28 01:40:05.0
【Android 细节(二)】业务操作类的生命周期中的开始方法

为了防止内存泄露或者其他更重要的原因,为业务操作类构建生命周期是必不可少的。

即在类里封装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获得value		phoneDbAdapter.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无关。


谢谢~















  相关解决方案