使用异步任务加载网络上的图片
我们知道,如果要加载一个很耗时的操作,会阻塞主线程,这时我们可以想到开启一个新的线程,避免阻塞,在android中也有这样的问题,我们可以用异步任务来操作,异步任务也是开启一个线程,线程里面发一个消息,然后通知去改变UI。
废话不多说,我们先看一个例子:我们可以打开这个网址:http://img1.3lian.com/img2011/07/20/05.jpg可以看到一副很好看的图片,我们就要把这个图片显示出来,首先,还是先要布局,我们要显示一幅图片,所以我们的布局中需要一个ImageView,布局很简单,一个ImageView就可以了:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 <ImageView 7 android:id="@+id/img" 8 android:scaleType="fitXY" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent"/>11 </LinearLayout>
之后我们要写一个Activity显示这个图片,不过要加载网络上的图片,我们需要从一个URL的流中获取这个图片,所以我们要写一个方法来获取这张图片:
1 public Drawable loadImages(String url) { 2 try {3 return Drawable.createFromStream((InputStream)(new URL(url)).openStream(), "test");4 }5 catch (IOException e) {6 e.printStackTrace();7 }8 return null;9 }
从URL中打开流,强制转换成InputStream,然后从流中拿到Drawable。
既然可以获取图片了,我们要考虑一个问题,如果图片很大,加载的很慢怎么办,我们岂不是要等很久?不要紧,这时候我们就可以用异步任务了。
首先我们要写一个内部类,这个类部类是继承自异步任务的,需要重载里面的doBackGround方法:
1 private class ImageAsynTask extends AsyncTask<Void, Void, Drawable> { 2 3 @Override 4 protected Drawable doInBackground (Void... params) { 5 String url = "http://img1.3lian.com/img2011/07/20/05.jpg"; 6 return loadImages(url); 7 } 8 9 @Override10 protected void onPostExecute (Drawable result) {11 super.onPostExecute(result);12 mDialog.dismiss();13 mImage.setImageDrawable(result);14 }15 16 @Override17 protected void onPreExecute () {18 super.onPreExecute();19 mDialog.show();20 }21 }
首先看这个方法:onPreExecute()这个方法是在doInBackGround前面执行。我们把这个方法写出来,我们需要在获取图片之前等待的时间里,写一个progressDialog,显示出来,提示用户,目前正在加载图片,需要等待一段时间。同时在后台操作doBackGround运行。
在doBackGround完成之后就会执行onPostExecute(Drawable result)方法,看这个方法就知道,必须在doBackGround完成之后,把得到的结果Drawable作为参数传到onPostExecute方法里面去,执行这个方法就表示已经加载完了,我们需要将progressDialog消失掉,然后把图片显示出来就可以了,整个过程很简单。
看下整个Activity的代码:
1 package com.test.asyntask; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.URL; 6 7 import android.app.Activity; 8 import android.app.ProgressDialog; 9 import android.graphics.drawable.Drawable;10 import android.os.AsyncTask;11 import android.os.Bundle;12 import android.widget.ImageView;13 14 import com.test.R;15 16 public class AsynTask extends Activity {17 18 private ImageView mImage;19 private ProgressDialog mDialog;20 21 @Override22 protected void onCreate (Bundle savedInstanceState) {23 super.onCreate(savedInstanceState);24 setContentView(R.layout.asyn_task);25 26 mDialog = new ProgressDialog(this);27 mDialog.setTitle("请稍等");28 mDialog.setMessage("正在加载...");29 30 mImage = (ImageView) findViewById(R.id.img);31 new ImageAsynTask().execute();32 }33 34 private class ImageAsynTask extends AsyncTask<Void, Void, Drawable> {35 36 @Override37 protected Drawable doInBackground (Void... params) {38 String url = "http://img1.3lian.com/img2011/07/20/05.jpg";39 return loadImages(url);40 }41 42 @Override43 protected void onPostExecute (Drawable result) {44 super.onPostExecute(result);45 mDialog.dismiss();46 mImage.setImageDrawable(result);47 }48 49 @Override50 protected void onPreExecute () {51 super.onPreExecute();52 mDialog.show();53 }54 }55 56 @Override57 protected void onDestroy () {58 super.onDestroy();59 mDialog.dismiss();60 }61 62 public Drawable loadImages(String url) { 63 try {64 return Drawable.createFromStream((InputStream)(new URL(url)).openStream(), "test");65 }66 catch (IOException e) {67 e.printStackTrace();68 }69 return null;70 }71 }
运行一下,看下效果:
1.显示progressDialog的时候,在加载图片但是图片还没有加载出来的时候:
2.看一下显示出来的图片吧:
可以看到,加载完成后,图片可以显示出来了。
另外需要注意的是,需要在manifest里面加入链接网络的权限:
1 <uses-permission android:name="android.permission.INTERNET"/>
另外在onDestory()的时候要把progressDialog dismiss掉,不让在退出应用程序的时候会报错。
好了就到这儿吧,外面打很大的雷,估计下雨了吧,我还没带伞呢,哎,又得淋雨回去了啊。。。。悲惨啊。。。
哦,对了,把源代码传上来吧,里面的内容很多,都是写的例子程序,在com.test.asyntask包里面。
点击我下载
转载于:https://www.cnblogs.com/shang53880/archive/2011/08/01/2124146.html
使用异步任务加载网络上的图片相关推荐
- OKhttp加载网络上的图片
使用OKhttp只需要做到五个步骤即可,下面通过一个Demo来看看OKhttp的强大之处(最下面有完整代码和详细注释): 一.关联OKhttp框架,添加网络权限 1.jar包准备 官方介绍页面有链接位 ...
- Android Drawable来加载网络上的图片
Drawable类中提供了一个静态方法可以直接添加网络上的图片 Drawable.createFromStream( new URL(img_str_url).openStream(),"s ...
- 通过ClassLoader加载硬盘上的图片到内存及ImageIO的使用
@Testpublic void test() throws IOException {// BufferedImage image = ImageIO.read(new File("E:\ ...
- iOS 动态加载LaunchScreen上的图片
前言 hihi,勇敢的小伙伴儿们大家好,明天就要放元旦假期了,小长假三天你们准备去哪玩呢? 我就不出去玩了,买了一本新书在家攻读,如果有时间有机会的话我会写成博客跟大家一起分享. 今天分享的这个吧,恕 ...
- Android开发之异步任务加载网络图片并存储在sdcard中(源代码分享)
在MainActivity中的代码 package com.example.f02_sdcard02;import android.os.AsyncTask; import android.os.Bu ...
- Android之ListViewJson加载网络数据
使用到的主要内容: 1.Json 解析网络数据 2.异步任务加载图片和数据 3.ListView 的内存空间优化(ConvertView)和运行时间优化(ViewHolder) 4.ListView ...
- 列表异步线程加载图片
手机客户端以列表形式展示数据是非常常见的一种方式.然而列表中要显示图片(比如:头像)就要采用异步线程加载的方式,这样做是为了防止加载图片数据的时候,花费时间过长,阻塞UI线程,从而达到保持App的流畅 ...
- 浅谈Android中的异步加载之ListView中图片的缓存及优化三
隔了很久没写博客,现在必须快速脉动回来.今天我还是接着上一个多线程中的异步加载系列中的最后一个使用异步加载实现ListView中的图片缓存及其优化.具体来说这次是一个综合Demo.但是个人觉得里面还算 ...
- .ajax显示加载动画,jQuery Ajax 加载数据时异步显示加载动画
ajax加载后台数据就不说的那么细了. 看下面代码首先前台上放置代码 在js脚本文件中首先把这个图片动画隐藏 代码如下 $(document).ready(function () { $(" ...
最新文章
- Python学习系列day5-python基础
- matlab中select,[转载]MATLAB阈值获取函数ddencmp、thselect、wbmpen和w
- python基础整理——关于进制输出初探
- python绘制并列的条形图的方法_如何并排绘制具有相同X坐标的条形图('dodged')...
- 【学习笔记】Unreal(虚幻)4引擎入门(三)
- 推荐一款超级好用的开源项目画图工具
- 怎样用计算机做周计划表,电脑如何制作学生学习计划表
- 11个最佳Ionic应用程序模板
- 被指开除高级研究员,谷歌大神Jeff Dean回应:是她说不答应条件就离职
- 聊一聊如何把SSL证书安装到小鸟云服务器上
- 当当网超级优惠券,别错过!(限时限量)
- 苹果手机最近删除的照片删除了怎么恢复?
- No resource found that matches the given name 'Theme.AppCompat.Light 的完美解决方案
- 为什么机器学习之路没有捷径可走?
- 【流浪地球——休眠仓】题解
- bat文件ping服务器,Windows下Ping一段IP地址的BAT
- ENVI中操作出现Error :array dimensions must be greater than 0错误的解决方法
- win10打开程序响应很慢_【电脑维护宝典】WIN10系统下的电脑维护
- LED驱动程序第一课
- Be Agile VS Do Agile 之 1