免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1992 | 回复: 1
打印 上一主题 下一主题

[Android] Android异步下载网络图片(其二) [复制链接]

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-28 13:38 |只看该作者 |倒序浏览
我们使用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 类定义如下:
  1. public class MyASyncTask extends AsyncTask<String, Integer, Bitmap> {
复制代码
在doInBackground(Params...)  方法中 ,接受String ....params,返回我们需要的Bitmap.当然我们这里是获取图片Bitmap所以要返回Bitmap

  如果你返回的需要是String或者其他复杂类型时候,需要修改类的定义参数类型为你需要返回的类型,当然接受参数也是根据你的请求需要改变。
  1. @Override
  2.     protected Bitmap doInBackground(String... params) {
  3.         Bitmap bitmap=null;
  4.         try {
  5.             
  6.             URL url = new URL(params[0]);
  7.             HttpURLConnection con=(HttpURLConnection) url.openConnection();
  8.             con.setDoInput(true);
  9.             con.connect();
  10.             InputStream inputStream=con.getInputStream();
  11.             
  12.             bitmap=BitmapFactory.decodeStream(inputStream);
  13.             inputStream.close();
  14.         }
  15.          catch (MalformedURLException e) {
  16.                 e.printStackTrace();
  17.             }catch (IOException e) {
  18.             // TODO Auto-generated catch block
  19.             e.printStackTrace();
  20.         }
  21.         return bitmap;
  22.     }
复制代码
在 onPostExecute(Result) 中是请求获得结果后更新UI部分。你会看到他的参数就是我们类中的类型参数。代码如下:
  1. //执行获得图片数据后,更新UI:显示图片,隐藏进度条
  2.     @Override
  3.     protected void onPostExecute(Bitmap Result){
  4.         ImageView imgView=(ImageView)this.viewGroup.getChildAt(0);
  5.         imgView.setImageBitmap(Result);
  6.         ProgressBar bar=(ProgressBar)this.viewGroup.getChildAt(1);
  7.         bar.setVisibility(View.GONE);
  8.     }
复制代码
然后怎么用呢?在UI线程中执行吧:

MyASyncTask yncTask=new MyASyncTask(this,frameLayout);
   yncTask.execute(params);

运行结果与上节大同小异

论坛徽章:
0
2 [报告]
发表于 2015-10-04 16:04 |只看该作者
楼主写的不错!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP