- 浏览: 552909 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
0759cxz:
good job!
Android 同时使用多个library时的问题 -
zhouxiaoli521:
lgj452555712 写道cursor 没有关闭,最好加上 ...
Android sqlite中判断某个表是否存在方法 -
lgj452555712:
cursor 没有关闭,最好加上finally 后关上fina ...
Android sqlite中判断某个表是否存在方法 -
zhouxiaoli521:
zhouxiaoli521 写道weinifk 写道publi ...
StringBuffer的setLength -
zhouxiaoli521:
weinifk 写道public static void ma ...
StringBuffer的setLength
平时我们在开发Android程序时遇到较耗时任务的处理,如I/O访问的数据库操作、网络访问等情况时造成UI假死等问题,通过 AsyncTask可以很好的解决这个问题,就今天以在Android中执行Downloader.downloadFile(url),可能会堵塞整个界面。显然这会影响用户体验,我们如何解决这个问题呢?
方法一、
创建一个新的线程执行我们的任务,使用Thread类,在 run(){}中写入任务代码,比如:
new Thread(new Runnable() {
public void run() {
Downloader.downloadFile(url);
}
}).start();
但使用Thread会产生一些意想不到的问题,需要程序员用更多的代码手动的维护它。
方法二: Android SDK为我们提供了一个后台任务的处理工具AsyncTask。AsyncTask就是一个封装过的后台任务类顾名思义就是异步任务,方便我们维护,Android开发网提示这样的好处可以解决一些线程安全问题,AsyncTask直接继承于Object类,位置为 android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载四个方法(至少重载一个)。
三个泛型:
Param ,任务执行器需要的数据类型
Progress 后台计算中使用的进度单位数据类型
Result 后台计算返回结果的数据类型
有些参数是可以设置为不使用的,只要传递为Void型即可,比如AsyncTask
四个步骤:
onPreExecute(),执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。
doInBackground(Params...),后台进程执行的具体计算在这里实现,doInBackground(Params...)是AsyncTask的关键,此方法必须重载。在这个方法内可以使用 publishProgress(Progress...)改变当前的进度值。
onProgressUpdate(Progress...),运行于UI线程。如果在doInBackground(Params...)中使用了publishProgress(Progress...),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。
onPostExecute(Result),运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params...)的返回值。此方法也要经常重载,如果Result为null表明后台任务没有完成(被取消或者出现异常)。
方法一、
创建一个新的线程执行我们的任务,使用Thread类,在 run(){}中写入任务代码,比如:
new Thread(new Runnable() {
public void run() {
Downloader.downloadFile(url);
}
}).start();
但使用Thread会产生一些意想不到的问题,需要程序员用更多的代码手动的维护它。
方法二: Android SDK为我们提供了一个后台任务的处理工具AsyncTask。AsyncTask就是一个封装过的后台任务类顾名思义就是异步任务,方便我们维护,Android开发网提示这样的好处可以解决一些线程安全问题,AsyncTask直接继承于Object类,位置为 android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载四个方法(至少重载一个)。
三个泛型:
Param ,任务执行器需要的数据类型
Progress 后台计算中使用的进度单位数据类型
Result 后台计算返回结果的数据类型
有些参数是可以设置为不使用的,只要传递为Void型即可,比如AsyncTask
四个步骤:
onPreExecute(),执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。
doInBackground(Params...),后台进程执行的具体计算在这里实现,doInBackground(Params...)是AsyncTask的关键,此方法必须重载。在这个方法内可以使用 publishProgress(Progress...)改变当前的进度值。
onProgressUpdate(Progress...),运行于UI线程。如果在doInBackground(Params...)中使用了publishProgress(Progress...),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。
onPostExecute(Result),运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params...)的返回值。此方法也要经常重载,如果Result为null表明后台任务没有完成(被取消或者出现异常)。
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
public class main extends Activity { ImageView imageView01; TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) this.findViewById(R.id.TextView01); imageView01 = (ImageView) this.findViewById(R.id.ImageView01); GetImage getImage = new GetImage(); getImage.execute("http://hi.csdn.net/attachment/201010/27/0_1288149117Yk8W.gif"); } private class GetImage extends AsyncTask { public GetImage() { super(); // TODO Auto-generated constructor stub } @Override protected void onCancelled() { Log.i("czb", "onCancelled is running..."); super.onCancelled(); } @Override protected void onPostExecute(Object result) { /* * 此方法在主线程执行,任务执行的结果作为此方法的参数返回 */ Log.i("czb", "onPostExecute is running..."); Log.i("czb", "result == null ? " + (result == null)); imageView01.setImageBitmap((Bitmap)result); super.onPostExecute(result); } @Override protected void onPreExecute() { /* * 执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件 */ Log.i("czb", "onPreExecute is running..."); super.onPreExecute(); } @Override protected void onProgressUpdate(Object... values) { /* * 此方法在主线程执行,用于显示任务执行的进度。 */ Log.i("czb", "onProgressUpdate is running..."); // 由publishProgress传递的值 Log.i("czb", "values " + values[0]); super.onProgressUpdate(values); } @Override protected Object doInBackground(Object... params) { /* * 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。 * 在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。 */ Log.i("czb", "doInBackground is running..."); try { Bitmap bitmap; HttpClient client = new DefaultHttpClient(); // params[0]代表连接的url URI uri = URI.create((String) params[0]); HttpGet get = new HttpGet(uri); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); Log.i("czb", " " + length); InputStream in = entity.getContent(); if (in != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); /*byte[] buf = new byte[128]; int ch = -1; int count = 0; while ((ch = in.read(buf)) != -1) { baos.write(buf, 0, ch); count += ch; if (length > 0) { // 如果知道响应的长度,调用publishProgress()更新进度 // onProgressUpdate读取进度 publishProgress((int) ((count / (float) length) * 100)); } // 为了在模拟器中清楚地看到进度,让线程休眠100ms //Thread.sleep(100); }*/ bitmap = BitmapFactory.decodeStream(in); in.close(); baos.close(); return bitmap; } } catch (Exception e) { e.printStackTrace(); } return null; } } }
发表评论
-
Android NDK开发环境搭建_r8
2014-04-23 16:32 1032本文主内容: 1、 Android NDK 安装 2、 ... -
Android java.lang.VerifyError 异常解决办法
2014-04-01 13:58 4537通常这个异常的问题出现在jar包上 我的情况是 sdk ... -
Android —— 关于ADT 17的BuildConfig.DEBUG
2014-03-21 11:02 1109在日常开发中,我们使用android.util.Lo ... -
Android 让多个Fragment 切换时不重新实例化
2013-12-05 18:48 1416在项目中需要进行Fragment的切换,一直都是用repla ... -
android学习—— context 和 getApplicationContext()
2013-09-22 11:08 1888在android中常常会遇到与context有关的内容 浅 ... -
Android requestFeature() must be called before adding content
2013-07-08 17:18 2306E/AndroidRuntime( 408): androi ... -
Android onActivityResult和横屏
2013-06-20 16:48 1785做一个项目 页面强制横屏 两个activity需要交互 现 ... -
Android 无法加载fragment的问题
2013-06-17 14:42 2395在项目中继承了fragment 重写了构造函数 make ... -
android源码解读一(Context)
2013-04-27 19:16 1709Context类 Context是一个抽象类 publi ... -
Android 4.1 动态加载APK中的资源
2013-04-24 17:29 4143*** is not owned by the curr ... -
Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8
2013-04-15 15:45 1738过程中,增大对应AVD的 ... -
Android下面的MD5加密
2013-04-08 12:17 954网上关于android下MD5加密的资料很多,但是测试了下 ... -
Android 调用系统应用程序信息(Application Info)界面
2013-03-15 18:30 1231“Android系统设置->应用程序->管理应用 ... -
Android Dialog背景透明和黑暗度
2013-03-14 18:20 4031设置透明度,主要设置的是dialog自身的透明度 ... -
全局监听SCREEN_ON和SCREEN_OFF的替代方法--监听屏幕解锁事件
2013-03-08 12:17 3000在做一个程序的时候,需要时刻保持某一服务是启动的, ... -
Android 退出应用程序
2013-01-21 10:53 893android.os.Process.killProcess ... -
Android控件WebView(浏览器)常用功能(图片、缩放)例子介绍
2012-11-06 11:03 2497Android系统默认提供WebView控件(view)来在应 ... -
Android ProgressBar使用.9图在部分android手机上显示异常!
2012-11-05 10:18 2097写道 我使用的是progressbar.xml配置文 ... -
Android 同时使用多个library时的问题
2012-10-29 12:40 1545剧情是这样,我的app要使用两个library,如:Li ... -
android圆形进度条ProgressBar颜色设置
2012-07-29 15:14 1299总结的挺全面 http://aichixihongshi.i ...
相关推荐
AsyncTask_简单演示AsyncTask异步操作,写一个简单的AsyncTask异步操作解决上一篇文章提到的线程阻塞问题,对应我的博客《网易博客迁移:Android专题之AsyncTask(二)简单演示AsyncTask异步操作》,有问题欢迎留言...
一个AsyncTask的Demo,简单的描述了AsyncTask的操作
自己写了一个基于httpurlconnection和Asynctask的例子
Android AsyncTask的简单Demo,对应Blog文章:http://blog.csdn.net/dolacmeng/article/details/50215519
AsyncTask的用法
Android AsyncTask 文章集合
Android AsyncTask Demo 自己参考网络写的学习 demo
AsyncTask_演示线程阻塞,对应我的博客《Android专题之AsyncTask(一)基本概念介绍》,有问题欢迎留言讨论。
AsyncTask练习demo,对着写写,有利理解
最新AsyncTask源码
Android AsyncTask异步处理下载网页
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。 1) 子类化AsyncTask 2) 实现AsyncTask中定义的下面一个或几个方法 ...
Handler与AsyncTask使用示例,Handler AsyncTask 示例 looper
AsyncTask 断点下载
android 任务后台处理事物 asyncTask封装
很简单的AsyncTask小例子,
Android Handler AsyncTask 异步加载
这次上传的是AsyncTask 异步下载图片的提高篇,相比基础篇这一篇的技术含量会高一些
Android AsyncTask实例,测试ok。
AsyncTask.java,AsyncTask.java,AsyncTask.java,AsyncTask.java