zoukankan      html  css  js  c++  java
  • Android应用开发中关于this.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()方法。

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

  • 相关阅读:
    java web项目打包.war格式
    version 1.4.2-04 of the jvm is not suitable for thi
    Sugarcrm Email Integration
    sharepoint 2010 masterpage中必须的Content PlaceHolder
    微信开放平台
    Plan for caching and performance in SharePoint Server 2013
    使用自定义任务审批字段创建 SharePoint 顺序工作流
    Technical diagrams for SharePoint 2013
    To get TaskID's Integer ID value from the GUID in SharePoint workflow
    how to get sharepoint lookup value
  • 原文地址:https://www.cnblogs.com/dazuihou/p/3613845.html
Copyright © 2011-2022 走看看