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。部分源码如下:
public class ContactInfoResolver {
private Context context;
public ContactInfoResolver(Context context){
this.context=context;
}
/**
* 返回所有的联系人的信息
* @return
*/
public List<ContactInfo> getContactInfos(){
//将所有联系人存入该List集合
List<ContactInfo> infos=new ArrayList<ContactInfo>();
//使用ContentResolver查找联系人数据
Cursor cursor=context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
..........
第十行代码中的ContactInfo封装了每个联系人的数据。第十四行中要用到getContentResolver()方法,因为此方法是Context的方法,所以必须要声明一个Context的成员变量(第二行),注意红色标记的context其实指向了同一个context。但是,核心问题来了,为什么要写三、四行的代码呢?
下面再看另一个继承自Activity的SelectContactActivity类,它里面要调用ContactInfoResolver的getContactInfos()方法。部分源码
public class SelectContactActivity extends Activity {
private ListView lv_select_contact;//用于展现联系人列表
private ContactInfoResolver resolver;//用于获取手机联系人对象
private List<ContactInfo> infos;//接收获取到的所有联系人
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.select_contact);
lv_select_contact=(ListView) findViewById(R.id.lv_select_contact);
resolver=new ContactInfoResolver(this);
infos=resolver.getContactInfos();
............
在第十行,创建一个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()方法。
水平有限,只能暂时理解到这里,希望以后再回头看看的时候能有更深层次的理解。
Android应用开发中关于this.context=context的理解的更多相关文章
- Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听
原文:Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听 简单记录下android 盒子开发遥控器的监听 ,希望能帮到新入门的朋友们 不多说,直接贴代码 public cla ...
- Android学习开发中如何保持API的兼容
Android学习开发中如何保持API的兼容: 1,采用良好的设计思路 在设计过程中,如果能按照下面的方式来进行设计,会让这个API生命更长久 面向用例的设计,收集用户建议,把自己模拟成用户,保证AP ...
- Android应用开发中三种常见的图片压缩方法
Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法 private Bitmap com ...
- android开发中的 Activity 与 Context 区别与联系
Context 是 Application /Activity /Service的基类 Intent(Context , Class); Activity中的上下文Context是随着活动的产生而产生 ...
- Android应用开发中,第三方集成新浪微博(sinaWeiboSDK)的过程记录
作为一个android开发人员,不可避免的要学会使用和集成第三方API的能力 而新浪微博作为现在最主要的新闻速递媒体,使用十分普遍,并且提供了较为详细的API接入方法,故此选择集成sinaWeibiS ...
- Android应用开发中webview上传文件的几种思路
1. 常规方法,重写WebChromeClient 的 openFileChooser 方法 private class MyWebChromeClient extends WebChromeClie ...
- 【Android】开发中个人遇到和使用过的值得分享的资源合集
Android-Classical-OpenSource Android开发中 个人遇到和使用过的值得分享的资源合集 Trinea的OpenProject 强烈推荐的Android 开源项目分类汇总, ...
- Unity3d Android Http 开发中的坑(吐槽
在一般的U3D网络开发中,直接使用WWW类便足够正常使用,但我在发现使用WWW下载大文件时,会导致整个程序卡顿的情况(不清楚是否我个人电脑问题),所以干脆使用HttpWebRequest/HttpWe ...
- 浅谈Android系统开发中LOG的使用
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...
随机推荐
- poj 2892 &&hdu 1540 Tunnel Warfare
http://poj.org/problem?id=2892 #include <cstdio> #include <cstring> #include <algorit ...
- NTOPNG修改密码
感觉这个有点妖,因为在两个实例上修改密码都失败了. 于是,从网上看看是怎么回事, 按以下步骤重置你想要的密码: 1,为密码生成MD5字串: echo -n "your_password&qu ...
- Android JSON,Gson,fastjson实现比较
activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)
调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...
- c/c++关于内存分配的知识(非常详细的比较,且VirtualAlloc分配内直接在进程的地址空间中保留一快内存)
一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一 ...
- 【HDOJ】4628 Pieces
最开始的想法是搜索,发现不对,后来发现数据量很小,可以状态压缩+DP. /* 4628 */ #include <cstdio> #include <cstring> #inc ...
- (转载)细说PHP中strlen和mb_strlen的区别
(转载)http://developer.51cto.com/art/201105/263103.htm 在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果 ...
- freemarker基本知识总结
1.取出内容 ${} 例如,${document.fileName} 2. <ul> <#list cms.documents("channel=XXXX") a ...
- cf590B Chip 'n Dale Rescue Rangers
B. Chip 'n Dale Rescue Rangers time limit per test 1 second memory limit per test 256 megabytes inpu ...
- Test execution order
刚开始的时候,JUnit并没有规定测试方法的调用执行顺序.方法通过映射的API返回的顺序进行调用.然 而,使用JVM顺序是不明智的,因为Java平台没有规定任何特定的顺序,事实上JDK7或多或少的返回 ...