Android学习之分析代码&巩固基础
2017-03-24 00:17
429 查看
最近为了准备面试去刷题,今天遇到了一个非常典型的,觉得很经典的一个题目:
阅读代码回答运行结果:
public classMainActivity extends Activity implements OnClickListener
{
private Button mBtnLogin = (Button) findViewById(R.id.btn_login);
private TextView mTextViewUser;
@Override
protected void onCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextViewUser = (TextView) findViewById(R.id.textview_user);
mBtnLogin.setOnClickListener(this);
new Thread()
{
@Override
public void run()
{
mTextViewUser.setText(10);
}
}.start();
}
@Override
public void onClick(View v)
{
mTextViewUser.setText(20);
}
}猛的一看没有什么错误,但其实是很多细节没有注意到,所以当时这个题目做错了,看了一个大神的详解之后,受益颇多:
1、首先会报错NullPointerException,就是privateButton mBtnLogin = (Button) findViewById(R.id.btn_login);这个位置,要先加载了layout后才能成功获取到相应的按钮组件对象;
2、修改NullPointerException错误后再运行,报错 Resources$NotFoundException,在mTextViewUser.setText(10);这个位置(原本以为会先检查onclick方法里的setText(),但实际是run()里的setText()),要改成字符串形式;
3、修改上面的错误后再运行,报错Resources$NotFoundException,这次就轮到mTextViewUser.setText(20);这个位置了;
4、修改上面的错误后再运行,没有报错,程序成功运行,点击按钮后TextView由10变为20,说好的不能在非UI线程里更新UI组件呢?翻看别人的博客后,终于找到答案了,其实非UI线程是可以刷新UI的,前提是它要拥有自己的ViewRoot,ViewRoot是在onResume()里addview()创建的,所以是在 onResume()检查是否为UI线程,一般在onCreate()中通过子线程可以更新UI,但官方不建议这样做,因为 Android UI操作并不是线程安全的。
PS:而且,可以试下在上面代码的run()中setText()前加一句Thread.sleep(2000),先让线程休眠个2到3秒,就会报错 ViewRootImpl$CalledFromWrongThreadException,说明已经检查到在非UI线程里更新UI。
其实,实测之后就会发觉这些问题,感觉分析的很不错,题目也很经典,故而记录下来,警示自己要注重细节~!
阅读代码回答运行结果:
public classMainActivity extends Activity implements OnClickListener
{
private Button mBtnLogin = (Button) findViewById(R.id.btn_login);
private TextView mTextViewUser;
@Override
protected void onCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextViewUser = (TextView) findViewById(R.id.textview_user);
mBtnLogin.setOnClickListener(this);
new Thread()
{
@Override
public void run()
{
mTextViewUser.setText(10);
}
}.start();
}
@Override
public void onClick(View v)
{
mTextViewUser.setText(20);
}
}猛的一看没有什么错误,但其实是很多细节没有注意到,所以当时这个题目做错了,看了一个大神的详解之后,受益颇多:
1、首先会报错NullPointerException,就是privateButton mBtnLogin = (Button) findViewById(R.id.btn_login);这个位置,要先加载了layout后才能成功获取到相应的按钮组件对象;
2、修改NullPointerException错误后再运行,报错 Resources$NotFoundException,在mTextViewUser.setText(10);这个位置(原本以为会先检查onclick方法里的setText(),但实际是run()里的setText()),要改成字符串形式;
3、修改上面的错误后再运行,报错Resources$NotFoundException,这次就轮到mTextViewUser.setText(20);这个位置了;
4、修改上面的错误后再运行,没有报错,程序成功运行,点击按钮后TextView由10变为20,说好的不能在非UI线程里更新UI组件呢?翻看别人的博客后,终于找到答案了,其实非UI线程是可以刷新UI的,前提是它要拥有自己的ViewRoot,ViewRoot是在onResume()里addview()创建的,所以是在 onResume()检查是否为UI线程,一般在onCreate()中通过子线程可以更新UI,但官方不建议这样做,因为 Android UI操作并不是线程安全的。
PS:而且,可以试下在上面代码的run()中setText()前加一句Thread.sleep(2000),先让线程休眠个2到3秒,就会报错 ViewRootImpl$CalledFromWrongThreadException,说明已经检查到在非UI线程里更新UI。
其实,实测之后就会发觉这些问题,感觉分析的很不错,题目也很经典,故而记录下来,警示自己要注重细节~!
相关文章推荐
- android基础学习(1)-------代码方式实现布局
- [学习]分布式缓存系统TAIR代码分析<一>
- android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析
- 修改设置->关于手机->法律信息 下有一些Item,如开放源代码许可、Google法律信息等,这里分析的是Android 4.4的代码
- Android 学习 5 ->用代码布局和xml布局
- ARM&LINUX学习笔记(6)------启动代码分析
- Android 混淆代码学习以及And… 分类: Android开发 2014-05-30 10:55 95人阅读 评论(0) 收藏
- 黑马程序员---objective-c基础学习--第一个oc程序及代码分析
- phpwind代码分析之global.php简单说明(主要学习php基础知识的应用)
- 【Java&Android开源库代码分析】のandroid-async-http の开盘
- [学习]分布式缓存系统TAIR代码分析<二>
- Androidpn学习笔记-客户端代码分析
- STL基础学习(STL中的容器解析、代码展示、例题分析,帮助你学STL)
- 关于Python数据分析基础教程 Numpy学习指南 第二版 第二章中代码所呈现的问题
- OPhone/Android的学习(2)—从分析Eclipse自动生成的代码到以XML控制UI
- android Task Activity launchMode="singleTask" singleInstance 代码分析
- 3G之Android学习第三章节<<HelloWorld应用程序分析>>
- 通过代码学习C#&.NET——委托基础
- Android基础入门教程——1.10 反编译APK获取代码&资源
- 关于Python数据分析基础教程 Numpy学习指南 第二版 第三章中代码所呈现的问题