- 浏览: 913726 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
平时我们在开发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表明后台任务没有完成(被取消或者出现异常)。
- 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 JNI 编程常见小问题
2015-09-08 11:31 1189extern "C" { jint Jav ... -
Android ServiceManager注册自定义service
2015-08-19 09:53 4098当我们要使用android的系统服务时,一般都是使用Conte ... -
Android ALMP 架设web服务器配置
2014-10-08 18:48 1428随着信息时代的发展,智能手机已经越来越普及。下面本文将带大家把 ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 9879一、一个BUG引发的问题 ... -
Android XP MTP支持
2014-03-18 16:41 2226家里电脑是win7,连上直接豌豆荚装驱动就好了。但单位的XP却 ... -
Android Launcher2 icon大小修改
2012-08-16 19:12 5996不同分辨率、不同屏幕的不同设备,android 原生的Laun ... -
android 浏览器APN切换
2012-04-16 16:42 2276业务需求:有些链接需 ... -
android 浏览器全屏显示
2012-04-16 16:40 4850业务需求:浏览器设置中支持全屏显示的功能。 分析:只需要在 ... -
Android MD5校验码的生成与算法实现
2012-03-05 15:05 20312在Java中,java.security.MessageDi ... -
Android View的xml属性
2012-02-27 13:25 2797java.lang.Object andro ... -
Android Gallery3D源码学习总结(三)——Cache缓存及数据处理流程
2011-12-29 11:04 4639第一,在应用程序中有三个线程存在:主线程(随activity的 ... -
Android Gallery3d源码学习总结(二)——绘制流程drawThumbnails
2011-12-29 11:02 2869此函数控制相册表格页 ... -
Android Gallery 3D 特效精华
2011-12-29 10:45 5276Android Gallery 3D 特效精华 一、布 ... -
Android Gallery3d源码学习总结(一)——绘制流程drawFocusItems
2011-12-29 10:42 2687显示单张图片相关的输入变量 int selecte ... -
Android:AppWidget,PendingIntent,RemoteViews用法
2011-11-25 10:09 5822什么是AppWidget?AppWidget就是我们平常在 ... -
Android软件汉化/精简/去广告教程
2011-08-23 12:32 2866前言: 现在随处都可以找到功能强大的汉化工具,操作简 ... -
Android ListView页眉页脚效果
2011-07-06 14:07 2648大家都知道,在我们调用ListView的addFooterVi ... -
Android 获取设备信息
2011-06-22 21:09 7901)android 获取设备型号、OS版本号: imp ... -
Android 应用安装设置
2011-05-31 16:18 1843应用程序的默认安装位置以及是否可移动取决于该程序的开发者的配置 ... -
Android Activity去除标题栏和状态栏
2011-05-31 13:10 40431一、在代码中设置 public void onCreate( ...
相关推荐
Android AsyncTask的简单Demo,对应Blog文章:http://blog.csdn.net/dolacmeng/article/details/50215519
Android AsyncTask用法和异步加载图片通过AsyncTask 从网络上异步加载一张图片
Android AsyncTask Demo 自己参考网络写的学习 demo
Android AsyncTask异步处理下载网页
代码为博客的示例代码,有问题请博客中留言:http://blog.csdn.net/lmj623565791/article/details/38614699
AsyncTask 断点下载
Android AsyncTask 文章集合
android AsyncTask中更新progressBar 。可用于http请求、下载文件等
Android Asynctask 先小试牛刀,了解一下各个方法执行过程,关注博客http://himici.com/
android asyncTask的使用,通过简单的实例来说明Task异步类的使用
Android AsyncTask 同步下载图片,先是显示默认的图标,下载完成了立刻显示下载的图标,可以左右切换
android asynctask的fragment更新UI(附线程管理) 博客地址:http://blog.csdn.net/qq_16064871
Android AsyncTask Demo
简单的android AsyncTask 例子
android AsyncTask介绍,多线程。
主要为大家详细解析了Android AsyncTask使用以及源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
自己写了一个基于httpurlconnection和Asynctask的例子
里面是Android AsyncTask 的两种使用方法,一种是加载网络图片,一种是模拟耗时加载进度条
如果用现在做秒表,建议用asyncTask...