Android学习之分析代码&巩固基础
来源:互联网 发布:预包装食品网络销售 编辑:程序博客网 时间:2024/05/18 00:17
最近为了准备面试去刷题,今天遇到了一个非常典型的,觉得很经典的一个题目:
阅读代码回答运行结果:
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学习之分析代码&巩固基础
- Java基础巩固之线程学习
- Java基础巩固之线程学习
- Javascript代码学习巩固
- JQuery代码学习巩固
- Android基础巩固提升
- Android Fragment之巩固
- javaScript----基础巩固全面学习
- css基础巩固之选择器
- C++基础巩固之typedef
- java基础巩固之-线程
- Android学习之自己需要提高和巩固的知识
- CSS巩固学习之二
- Android开发巩固学习路线
- java基础巩固----servlet的重点学习
- java基础巩固----JSP的重点学习
- 前端学习1(html基础巩固)
- 前端学习2(css基础巩固)
- [leetCode刷题笔记]2017.03.23
- 手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz * 0 #
- 数据挖掘-目录-降维(Dimensionality Reduction)
- WebGL通过鼠标点击绘点
- EJB基础
- Android学习之分析代码&巩固基础
- string的erase方法, 第一次见, 没什么好说的
- C++ 智能指针
- ACM/ICPC Java高精度计算
- Docker 存储原理
- VMware虚拟机安装VMware Tools
- 数据挖掘-目录-评估
- 14. Longest Common Prefix
- MySQL timestamp NOT NULL插入NULL的问题