在上一节中,我们使用Handler、Thread/Runnable 、URL、HttpURLConnection等等来进行异步下载网络图片。
但是采用这种方式有一些缺点,如下:
线程的开销较大,如果每个任务都要创建一个线程,那么程序的效率要低很多。
线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。
另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。
那么有没有比较更好好的实现方式呢?这个可以有!它就是AsyncTask
AsyncTask的特点是任务在主UI线程之外运行,而回调方法是在主UI线程中,这就有效地避免了使用Handler带来的麻烦。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
- Params 启动任务执行的输入参数。
- Progress 后台任务执行的百分比。
- Result 后台执行任务返回的结果。
当然,使用它还必须覆盖它的一些抽象方法方法
doInBackground(Params...)
执行任务
onPostExecute(Result) 返回任务执行的结果,通常更新UI
onProgressUpdate (Progress... values)进度更新
注意:红色的是必须实现的。
第一步:设计好UI,与上节一样
第二步:也与上节一样。
第三步:主要是实例化AsyncTask,并执行execute(Params)
我们必须继承AsyncTask,并覆盖它的一些方法,我们这里主要是要获取网络图片,并保存为Bitmap,以便UI根据Bitmap来更新的。
那么需要为AsyncTask设置返回的类型参数为String,Integer,Bitmap 类定义如下:
View Code
public class MyASyncTask extends AsyncTask<String, Integer, Bitmap> {
在doInBackground(Params...)方法中,接受String ....params,返回我们需要的Bitmap.当然我们这里是获取图片Bitmap所以要返回Bitmap
如果你返回的需要是String或者其他复杂类型时候,需要修改类的定义参数类型为你需要返回的类型,当然接受参数也是根据你的请求需要改变。
View Code
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap=null;
try {
URL url = new URL(params[0]);
HttpURLConnection con=(HttpURLConnection) url.openConnection();
con.setDoInput(true);
con.connect();
InputStream inputStream=con.getInputStream();
bitmap=BitmapFactory.decodeStream(inputStream);
inputStream.close();
}
catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
在onPostExecute(Result)中是请求获得结果后更新UI部分。你会看到他的参数就是我们类中的类型参数。代码如下:
View Code
//执行获得图片数据后,更新UI:显示图片,隐藏进度条
@Override
protected void onPostExecute(Bitmap Result){
ImageView imgView=(ImageView)this.viewGroup.getChildAt(0);
imgView.setImageBitmap(Result);
ProgressBar bar=(ProgressBar)this.viewGroup.getChildAt(1);
bar.setVisibility(View.GONE);
}
然后怎么用呢?在UI线程中执行吧:
MyASyncTask yncTask=new MyASyncTask(this,frameLayout);
yncTask.execute(params);
运行结果与上节大同小异
本文出自:http://write.blog.csdn.net/postedit
分享到:
相关推荐
Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 ...
Android异步下载网络图片(其一) Android异步下载网络图片(其一) Android异步下载网络图片(其一) 源代码
写了一个图片异步加载类来下载缓存多张网络图片,实现类似新浪图片画廊自动播放幻灯片的效果。实现效果比较令人满意。如需改写只需要重新提供一个图片链接字符串数组即可
基于Android开发的异步加载网络图片
提供AsyncTask的使用实例 并通过异步下载网络图片 包括New Thread的是引用 Handler的使用
Android异步请求网络图片demo,博客地址:http://blog.csdn.net/yayun0516
android异步加载网络图片实例
项目中有时候需要获取网络上的图片,并下载下来到手机客户端显示。怎么做呢? 实现思路是: 1:在UI线程中启动一个线程,让这个线程去下载图片。 2:图片完成下载后发送一个消息去通知UI线程 2:UI线程获取到消息后,...
Android异步加载网络图片(线程),采用LruCache算法,使用线程回调接口,实现异步加载网络图片
Android 图片异步加载 加载网络图片
网上的很多代码只有AsyncImageLoader,没有PicUtils 我加上了PicUtils
android异步加载网络图片到ListView
一个很完整的android异步加载网络图片案例
Android AsyncTask用法和异步加载图片通过AsyncTask 从网络上异步加载一张图片
android Gallery实现异步加载网络图片 并只加载当前停止页面图
Android 开发中如何异步加载网络图片 二例
了解到网络给我们的应用带来丰富多彩的信息资源,带来好处的同时,却因为请求网络资源慢或者资源比较大,造成android部分网络延迟,用户体验下降,此项目就是来解决此问题的,供大家学习交流用撒.
一个非常好的 android gridview 异步加载图片的例子,需要17以上的api
异步任务网络下载图片一 Android 异步任务的使用与学习 网络连接与下载 网络获取数据 网络下载
Android banner 自动切换 异步加载网络图片