无痛线程
来源:互联网 发布:用友nc数据备份 编辑:程序博客网 时间:2024/06/11 03:15
Android UI toolkit不是线程安全的,所以在UI线程之外操作它们要小心了。
Android提供从其它线程访问UI线程的方法如下:
1) Activity.runOnUiThread(Runnable)
2) View.post(Runnable)
3) View.postDelayed(Runnable, long)
4) Handler
一个有bug的例子:
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
}).start();
}
使用上面提到的4种方法之一解决bug:
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.post(new Runnable() {
public void run() {
mImageView.setImageBitmap(b);
}
});
}
}).start();
}
但不幸的事情又发生了,这使得你的程序可读性和可理解下变差。为了彻底解决这个问题,android 1.5+提供了一个AsyncTask的辅助类,这简化了长时间运行任务的建立需要跟UI交互的问题。AsyncTask可以帮你管理线程,重写的代码如下:
public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
不管你用不用AsyncTask,永远记住单一线程模型的两个规则:
1) 不要block UI线程
2) 保证你只会在UI线程里访问android UI toolkit
- 无痛线程
- 开一场无痛会议
- ARM无痛苦起步
- ARM无痛苦起步
- xoops迁移无痛法
- Delphi Package无痛使用
- 无痛使用arc
- oAuth无痛入门指南
- 邢台无痛人流哪家好
- 邢台无痛人流钱
- 邢台无痛人流多少钱
- 无痛理解SIFT
- 主题:ARM无痛苦起步
- 无痛之ext3升ext4
- 有效无痛的代码评审
- 无痛人流要用多少钱
- 万州中医院做无痛人流
- 威海市无痛人流医院哪家好
- 我能使用这个Intent吗??
- 修改Fedora与windows双系统的启动顺序
- Drawable变换
- 多线程之进程、线程与多线程文字滚动的实现
- IFS 客户端 开发学习笔记4
- 无痛线程
- 声明Layout
- 心里话
- 有哪些用来绑定数据的adapter:
- freeswitch 两方通话过程中,按*3进入指定的会议
- 对textview进行linkify,像html里面的超链接
- Alpha值和Delta是什么东西?
- 替换布局示例(来自Notepad教程)
- 当创建Cursor对象时,