Android应用开发中关于this.context=context的理解

本文解释了在Android开发中为何需要通过构造函数传递Context,并通过实例说明了如何在自定义类中使用Context来获取系统资源和服务。

在Android应用开发中,有的类里面需要声明一个Context的成员变量,然后还需要在该类的构造函数中加上this.context=context;这行代码。为什么要这么写呢?不写不行么?

  先看下面这个例子,这是我在百度空间看到的:

  Button button=new Button(this); 括号里的this当然就是本质上Context,其指向的就是当前的Activity,原因形象点说就是Button为了能相应各种操作,记得让Android系统知道自己是属于哪个Activity,这个信息是必须的,因为只有这样Android才会对其进行管理,比如相应onClick()事件,否则Android连这个Button属于哪个Activity都不知道,怎么响应?。这样的理解有些形象化,如果能研究透彻源码应该领悟的更深刻,不过大概就是构造函数里的玄机吧。

     再举一个例子。

   比如我要新建一个获取手机联系人的类ContactInfoResolver。部分源码如下:

复制代码
 1 public class ContactInfoResolver {
 2     private  Context context;
 3     public ContactInfoResolver(Context context){
 4         this.context=context;
 5     }
 6     /**
 7      * 返回所有的联系人的信息
 8      * @return
 9      */
10     public  List<ContactInfo> getContactInfos(){
11             //将所有联系人存入该List集合
12      List<ContactInfo> infos=new ArrayList<ContactInfo>();
13           //使用ContentResolver查找联系人数据
14         Cursor cursor=context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
15         ..........
复制代码

  第十行代码中的ContactInfo封装了每个联系人的数据。第十四行中要用到getContentResolver()方法,因为此方法是Context的方法,所以必须要声明一个Context的成员变量(第二行),注意红色标记的context其实指向了同一个context。但是,核心问题来了,为什么要写三、四行的代码呢?

  下面再看另一个继承自Activity的SelectContactActivity类,它里面要调用ContactInfoResolver的getContactInfos()方法。部分源码 

复制代码
 1 public class SelectContactActivity extends Activity {
 2     private ListView lv_select_contact;//用于展现联系人列表
 3     private ContactInfoResolver resolver;//用于获取手机联系人对象
 4     private List<ContactInfo> infos;//接收获取到的所有联系人
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.select_contact);
 9         lv_select_contact=(ListView) findViewById(R.id.lv_select_contact);
10         resolver=new ContactInfoResolver(this);
11         infos=resolver.getContactInfos();
12                 ............
复制代码

  在第十行,创建一个ContactInfoResolver对象时,必须要传入this,因为在ContactInfoResolver有这个public ContactInfoResolver(Context context){}的构造方法,但是如果没有这个构造函数,就不会在第十行传入this,然后就会在ContactInfoResolver.java中的第14行报出NullPointerException空指针异常。

  如果没有构造函数,其实只是声明了成员变量context,但并没有对context进行初始化,在调用context.getContentResolver()时,就必然会出现空指针异常,其实,在创建ContactInfoResolver对象时传入的this,就是当前的Activity,即SelectContactActivity,之后在ContactInfoResolver的构造函数中,就完成了this.context=SelectContactActivity;(即把当前的Activity赋给了ContactInfoResolver对象的context)所以也就把成员变量context初始化了。这样子就即完成了初始化,让ContactInfoResolver知道是哪个Activity在调用getContentResolver()方法。

  水平有限,只能暂时理解到这里,希望以后再回头看看的时候能有更深层次的理解。

<think>好的,我现在需要帮助用户解决关于在Java构造函数中添加注释以及理解`this.mContext = context`在AndroidContext的作用。首先,我要回顾用户的问题,确保我理解正确。 用户的问题分为两部分: 1. 如何在Java构造函数中添加注释? 2. `this.mContext = context`在AndroidContext的作用是什么? 接下来,我需要逐步分析这两个部分,并确保回答准确且符合用户提供的引用内容。 首先,关于构造函数中的注释方法。Java中的注释通常有单行注释(//)、多行注释(/* */)和Javadoc注释(/** */)。用户可能想知道如何正确使用这些注释,特别是在构造函数中。例如,Javadoc注释可以描述构造函数的参数和用途,而单行或多行注释可以解释具体的实现细节。需要提到注释的位置和格式,可能还需要引用一些最佳实践,比如使用Javadoc来生成文档。 然后,关于`this.mContext = context`的作用。这里涉及到Android中的Context概念。根据用户提供的引用,特别是引用[2]和[3],ContextImpl是Context的实现类,应用中的Context方法实际上由ContextImpl处理。在构造函数中,将传入的Context赋值给类的成员变量mContext,这样其他方法就可以通过mContext来访问上下文相关的资源和服务,比如启动Activity、获取资源等。需要注意的是,正确选择Context的类型很重要,比如避免内存泄漏,通常推荐使用Application Context(通过getApplicationContext()获取)而不是Activity的Context,除非确实需要。 另外,用户提供的引用[3]提到,不同的Context获取方式,如Activity.this和getApplicationContext(),这可能会影响mContext的使用场景。例如,如果mContext持有Activity的引用,可能会导致Activity无法被回收,从而引发内存泄漏。因此,在构造函数中传入Context时,需要明确传入的是哪种类型的Context,并适当注释说明。 现在,我需要检查是否有遗漏的点。例如,构造函数中的注释除了描述参数外,是否还需要说明副作用或注意事项?比如,如果构造函数保存了Context的引用,是否应该提醒不要泄露Context?根据引用[3],建议优先使用Application Context,这可能需要在注释中注明。 对于`this.mContext = context`,可能需要解释为什么需要这样做,比如为了后续方法能够使用Context来访问系统服务或资源。同时,要区分不同Context的使用场景,避免错误使用导致的问题。 现在,结合用户提供的引用,特别是引用[2]和[3],可以指出ContextImpl是真正的实现类,而传入的Context可能是Activity或Application的Context。赋值给成员变量后,该类就可以在需要时使用这个Context执行操作,但需要注意Context的生命周期。 总结回答结构: 1. 构造函数中添加注释的方法,包括Javadoc和实现注释。 2. `this.mContext = context`的作用,结合Android Context的重要性,引用相关内容说明正确使用Context的类型和注意事项。 最后,生成相关问题,确保问题与主题相关,并帮助用户进一步理解。</think>### Java构造函数中添加注释的方法 在Java构造函数中添加注释时,通常有以下两种方式: 1. **Javadoc注释**:用于描述构造函数的参数、作用及注意事项,格式为`/** ... */`。例如: ```java /** * 初始化对象并绑定上下文 * @param context 上下文对象,推荐使用ApplicationContext避免内存泄漏[^3] */ public MyClass(Context context) { this.mContext = context; } ``` 2. **行内注释**:用于解释代码逻辑或关键操作,格式为`//`或`/* ... */`。例如: ```java public MyClass(Context context) { // 绑定上下文,确保后续操作可访问资源 this.mContext = context; } ``` --- ### `this.mContext = context`的作用及Context的意义 #### 1. 代码作用 - **赋值操作**:将构造函数的参数`context`赋值给类的成员变量`mContext`,使其他方法可通过`mContext`访问上下文。 - **生命周期管理**:若传入的是`Activity`的Context,需注意避免因长期持有导致内存泄漏;建议优先使用`ApplicationContext`[^3]。 #### 2. ContextAndroid中的核心作用 - **访问系统服务**:如启动Activity(`startActivity`)、获取资源(`getResources`)等。 - **组件通信桥梁**:Context是Activity、Service等组件的基类,提供与系统交互的接口[^2]。 - **实现细节**:实际功能由`ContextImpl`类实现,它是Context接口的具体实现类[^2]。 --- ### 示例代码及注释 ```java /** * 自定义工具类,需依赖Context访问资源 * 注意:传入的context应为ApplicationContext以保证生命周期安全[^3] */ public class MyUtils { private Context mContext; public MyUtils(Context context) { // 绑定上下文,后续方法通过mContext调用系统服务 this.mContext = context.getApplicationContext(); // 使用ApplicationContext避免泄漏 } public void showToast(String message) { Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); } } ``` --- ### 注意事项 1. **避免内存泄漏**:若类生命周期长于Activity(如单例),必须使用`ApplicationContext`而非`Activity.this`。 2. **功能依赖**:`mContext`用于访问资源时,需确保其未被销毁(如Activity已关闭时调用会崩溃)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值