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是广泛使用 ...
随机推荐
- Andoird 监听开机广播和关机广播
需求:有时候,我们需要自己的程序在开机后自动运行;在关机时,记录一些信息到文件中. 一.开机广播监听Android系统启动完成后会自动发出启动完成广播(android.intent.action.BO ...
- Reverse Linked List II——LeetCode
Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...
- SVN 服务器IP地址变更后客户端的修改
找到需要更新修改的代码目录: 在右键菜单TortoiseSVN>Relocate……对话框中可以更改svn服务器地址. so easy!
- Android新浪微博客户端(三)——添加多个账户及认证
原文出自:方杰|http://fangjie.info/?p=72 转载请注明出处 一.微博OAuth2.0认证 首先来说说授权过程,我这里授权是通过SDK的,先添加SDK的jar包,微博SDK的de ...
- c++ map 插入数据后,begin(),end()以及当前迭代器的变化
1. map.end()指向map的最后一个元素之后的地址,无论执行map.erase(iter)还是map.add(key, value),map.end()所返回的值永远不会发生变化,都是指向同一 ...
- <a>标签的href属性
<a> 标签的 href 属性用于指定超链接目标的 URL. 语法 <a href="value"> 属性值 值 描述 URL 超链接的 URL.可能的值: ...
- 八、频繁模式挖掘Frequent Pattern Mining
频繁模式挖掘(Frequent Pattern Mining): 频繁项集挖掘是通常是大规模数据分析的第一步,多年以来它都是数据挖掘领域的活跃研究主题.建议用户参考维基百科的association r ...
- NSURLConnection获取数据
- (void)loadDataFromUrl { NSURL* url = [NSURL URLWithString:@"http://m.weather.com.cn/data/1011 ...
- [CSS3 + HTML5] Modernizr
Modernizr is a library for detecting whether the user's browsers have certain features and based on ...
- VSS Get Latest Version 没有提示recursive的对话框解决
今天按照VSS使用时,当“Get Latest version”时,不小心勾选了 “Only show this dialog when the Shift key is down”,因此当我再“Ge ...