为了防止内存泄露或者其他更重要的原因,为业务操作类构建生命周期是必不可少的。
即在类里封装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无关。
谢谢~
时间: 2024-10-13 12:58:53