UI线程和异步任务AsyncTask
来源:互联网 发布:错生网络剧百度云资源 编辑:程序博客网 时间:2024/05/17 04:21
原文地址:http://developer.android.com/guide/components/processes-and-threads.html
当 Android 应用运行的时候,系统会创建一个线程用于管理应用的界面和各个接口模块、组件。通常,这个线程也成为UI线程(UI thread)。同样,在Android中,所有的组件都工作在UI线程中,系统并不会为组件开辟单独的线程。因此,只有UI 线程才能够修改用户界面。
在 UI 线程中执行耗时操作会造成 UI 线程阻塞,从而导致应用程序对于用户的响应变慢,影响用户体验。因此,在设计中,需要避免耗时操作阻塞UI 线程。另一方面,Android UI 工具并非线程安全,因此,在 UI 线程外是禁止对 UI 进行访问和操作。
那么,当应用需要执行耗时操作的时候,怎么办?以下面的情况为例,应用程序希望在点击之后,在后台下载图片通过 ImageView 显示出来。这段程序符合不再 UI 线程中执行耗时操作的原则,但是,却在非 UI 线程中,对 UI 组件 ImageView 进行操作。这种操作会使程序运行出现异常。
public void onClick(View v) {可以考虑采用如下的一些方法来解决这个问题:
new Thread(new Runnable() {
public void run() {
Bitmap b = loadImageFromNetwork("http://example.com/image.png");
mImageView.setImageBitmap(b);
}
}).start();
}
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable, long)
下面是运用 View.post(Runnable) 方法实现相同功能的代码示例:
public void onClick(View v) {同样,还可以采用异步任务 AsyncTask 的方式实现同样的功能,比如下面的实例。按钮按下后,执行异步任务,只需要完成相应的异步任务回调函数就好。
new Thread(new Runnable() {
public void run() {
final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");
mImageView.post(new Runnable() {
public void run() {
mImageView.setImageBitmap(bitmap);
}
});
}
}).start();
}
public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
/** The system calls this to perform work in a worker thread and
* delivers it the parameters given to AsyncTask.execute() */
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
/** The system calls this to perform work in the UI thread and delivers
* the result from doInBackground() */
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
0 0
- UI线程和异步任务AsyncTask
- Android - UI线程和异步(AsyncTask)线程
- 线程:后台异步任务AsyncTask
- *【线程优化】AsyncTask 异步任务
- 工作线程WorkThread和异步任务AsyncTask取舍
- Android中的线程池和AsyncTask异步任务(一)
- Android中的线程池和AsyncTask异步任务(二)
- Android中的线程池和AsyncTask异步任务
- AsyncTask异步任务线程框架(一)
- AsyncTask异步任务线程框架(二)
- Android线程管理之AsyncTask异步任务
- Android线程管理之AsyncTask异步任务
- ListView之BaseAdapter和AsyncTask异步任务
- AsyncTask异步任务(并行和串行)
- Android中AsyncTask(异步任务)和Handler(线程消息机制)的详解
- Thread AsyncTask(异步任务)、Handler 更新UI
- Android 学习笔记 线程操作 异步任务 AsyncTask
- Android之线程使用AsyncTask异步任务(一)
- struct 结构数组
- ucontext相关,开发自己线程库
- java泛型总结学习
- 《Maven实战》笔记三:使用MyEclipse创建Maven项目
- Linux下编译VLC for Android源代码总结
- UI线程和异步任务AsyncTask
- Sending data to Auditconsole via mlogc
- 蓝桥杯:分糖果
- opencv 鼠标响应函数
- opencv 学习之 阈值化<1> 单一阈值
- 小结:POI写Excel公式(函数)及从Excel中读取公式计算值
- activiti5第一弹-----基本的activiti示例
- [学习小结]Mybaits的解决字段名与实体类属性名不相同的冲突
- 文字加解密 自制桌面图标 IP地址查询 等工具