Android应用开发之Android应用开发之关于this.context=context代码的解析
凌雪 2018-09-21 来源 :网络 阅读 567 评论 0

摘要:本文将带你了解Android应用开发之Android应用开发之关于this.context=context代码的解析,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之Android应用开发之关于this.context=context代码的解析,希望本文对大家学Android有所帮助。


在Android应用开发中,有的类里面需要声明一个Context的成员变量,然后还需要在该类的构造函数中加上this.context=context;这行代码。为什么要这么写呢?不写不行么?
    先看下面这个例子,这是我在百度空间看到的:
    Button button=new Button(this); 括号里的this当然就是本质上Context,其指向的就是当前的Activity,原因形象点说就是Button为了能相应各种操作,记得让Android系统知道自己是属于哪个Activity,这个信息是必须的,因为只有这样Android才会对其进行管理,比如相应onClick()事件,否则Android连这个Button属于哪个Activity都不知道,怎么响应?。这样的理解有些形象化,如果能研究透彻源码应该领悟的更深刻,不过大概就是构造函数里的玄机吧。
    再举一个例子。
    比如我要新建一个获取手机联系人的类ContactInfoResolver。部分源码如下:
 public   class ContactInfoResolver { 2  private  Context   context; 3  public ContactInfoResolver(Context   context){ 4this.context=context; 5  } 6  /** 7*   返回所有的联系人的信息 8*   @return 9*/10  public  List  getContactInfos(){11 //将所有联系人存入该List集合12List  infos=new ArrayList();13  //使用ContentResolver查找联系人数据14Cursor   cursor=context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,   null, null, null,   null);15..........
第十行代码中的ContactInfo封装了每个联系人的数据。第十四行中要用到getContentResolver()方法,因为此方法是Context的方法,所以必须要声明一个Context的成员变量(第二行),注意红色标记的context其实指向了同一个context。但是,核心问题来了,为什么要写三、四行的代码呢?
    下面再看另一个继承自Activity的SelectContactActivity类,它里面要调用ContactInfoResolver的getContactInfos()方法。部分源码 
 public class   SelectContactActivity extends Activity { 2  private ListView   lv_select_contact;//用于展现联系人列表 3  private ContactInfoResolver resolver;//用于获取手机联系人对象 4  private   Listinfos;//接收获取到的所有联系人 5  @Override 6  protected void   onCreate(Bundle savedInstanceState)   { 7super.onCreate(savedInstanceState); 8setContentView(R.layout.select_contact); 9lv_select_contact=(ListView)   findViewById(R.id.lv_select_contact);10resolver=new   ContactInfoResolver(this);11infos=resolver.getContactInfos();12    ............
在第十行,创建一个ContactInfoResolver对象时,必须要传入this,因为在ContactInfoResolver有这个publicContactInfoResolver(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()方法。
    水平有限,只能暂时理解到这里,希望以后再回头看看的时候能有更深层次的理解。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注移动开发之Android频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程