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()方法。

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

  • 相关阅读:
    Codeforces1101G (Zero XOR Subset)-less 【线性基】【贪心】
    Codeforces1101F Trucks and Cities 【滑动窗口】【区间DP】
    HDU4651 Partition 【多项式求逆】
    BZOJ2554 color 【概率DP】【期望DP】
    codeforces1101D GCD Counting 【树形DP】
    codechef EBAIT Election Bait【欧几里得算法】
    BZOJ2434 [NOI2011] 阿狸的打字机 【树链剖分】【线段树】【fail树】【AC自动机】
    codeforces1093G Multidimensional Queries 【线段树】
    BZOJ3277 串 【后缀数组】【二分答案】【主席树】
    AHOI2013 差异 【后缀数组】
  • 原文地址:https://www.cnblogs.com/dazuihou/p/3613845.html
Copyright © 2011-2022 走看看