【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无关。

谢谢~

时间: 2024-10-13 12:58:53

【Android 细节(二)】业务操作类的生命周期中的开始方法的相关文章

深入java虚拟机(二)——类的生命周期(上)类的加载和连接

类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件).类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例.每个这样的实例用来表示一个 Java 类.通过此实例的 newInstance()方法就可以创建出该类的一个对象.实际的情况可能

【转】Java 类的生命周期详解

一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区

Java类的生命周期详解

引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域,这几

【转载】详解java类的生命周期

原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,

详解java类的生命周期

最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正.        首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区

java类的生命周期,从装载,链接,初始化到卸载,关键是何时卸载??

卸载       关于类的卸载,笔者在单例模式讨论篇:单例模式与垃圾回收一文中有过描述,在类使用完之后,如果有下面的情况,类就会被卸载: 该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例.加载该类的ClassLoader已经被回收.该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法.        如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生

activity生命周期中方法解析

对于activity的生命周期我觉得是一个简单而又不简单的问题,很多人可能觉得自己已经很精通了!往往事实却不以为然! 要接着讨论下面的问题,先来简单了解一下activity,来看一段原文的说明,如下: An activity is a single, focused thing that the user can do.  Almost all activities interact with the user, so the Activity class takes care of creat

java: Comparable比较器,定义二叉操作类

//定义二叉操作类 class BinaryTree{ class Node{ private Node left; //左指数 private Node right; //右指数 private Comparable data; public Node(Comparable<?> data) { this.data = data; } //二叉数据比较,大的放在右边,小的放在左边 public void addNode(Node newNode) { //放在左边 if( newNode.d

(Android学习系列)二,窗口(Activity)的生命周期

在Activity从创建到销毁的过程中需要在不同的阶段调用7个生命周期的方法这7个生命周期方法定义如下: protected void onCreate(Bundle savedInstanceState) protected void onStart() protected void onResume() protected void onPause() protected void onStop() protected void onRestart() protected void onDe