Android异步载入

概述

Android异步载入在Android中使用的很广泛,除了是由于避免在主线程中做网络操作。更是为了避免在显示时由于时间太长而造成ANR,添加显示的流畅性,特别是像ListView、GridView这种控件。假设getView的时间太长,就会造成很严重的卡顿,很影响性能。
本系列将展示在Android中怎样进行异步载入操作,并使用ListView来作为演示的对象。

怎样下载图像

下载自然是须要使用网络,使用网络就不能在主线程。在主线程就会爆炸。所以我们必须要在非主线程中去下载图像。OK。那么下载使用的方法呢。许多,这里简单的列举几种

HttpURLConnection

private static Bitmap getBitmapFromUrl(String urlString) {Bitmap bitmap;InputStream is = null;try {URL url = new URL(urlString);HttpURLConnection conn = (HttpURLConnection) url.openConnection();is = new BufferedInputStream(conn.getInputStream());bitmap = BitmapFactory.decodeStream(is);conn.disconnect();return bitmap;} catch (Exception e) {e.printStackTrace();} finally {try {if (is != null)is.close();} catch (IOException e) {}}return null;
}

很easy。甚至都没做超时等处理。这里偷个懒。

Drawable

Drawable d = Drawable.createFromStream(is, "url");

也很easy,仅仅是须要进行下转换。

ListView

这一篇作为开篇。我们还是来扯下淡,这个ListView,大家都用过,最经常使用的优化也就是使用ViewHolder模式进行复用,避免反复的inflate和findViewById而影响效率,相信大部分的开发人员都已经熟知,这里我们还是贴下Adapter的代码:
package com.imooc.listviewacyncloader;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;import java.util.List;public class MyAdapterNotUseCaches extends BaseAdapter {private LayoutInflater mInflater;private List<String> mData;public MyAdapterNotUseCaches(Context context, List<String> data) {this.mData = data;mInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return mData.size();}@Overridepublic Object getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {String url = mData.get(position);ViewHolder viewHolder = null;if (convertView == null) {viewHolder = new ViewHolder();convertView = mInflater.inflate(R.layout.listview_item, null);viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_lv_item);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.imageView.setTag(url);viewHolder.imageView.setImageResource(R.drawable.ic_launcher);return convertView;}public class ViewHolder{public ImageView imageView;}
}

确实很easy哈。最主要的ViewHolder模式使用ListView。只是,这里有点须要注意的:

viewHolder.imageView.setTag(url);

这个事实上是很重要的,为什么重要我们后面会继续说。

除了这个地方,其他的部分,假设你能独立写出来。相信你已经击败了10%的开发人员了,后面我们再来讲怎样击败剩下90%的开发人员。

图像

图像我们能够从网络相冊里面来获取,这里偶然找到郭神的一篇博客里面的图像地址,就无耻的拿来用了:
public class Images {public final static String[] IMAGE_URLS = new String[] {"https://img-my.csdn.net/uploads/201407/26/1406383299_1976.jpg","https://img-my.csdn.net/uploads/201407/26/1406383291_6518.jpg","https://img-my.csdn.net/uploads/201407/26/1406383291_8239.jpg","https://img-my.csdn.net/uploads/201407/26/1406383290_9329.jpg","https://img-my.csdn.net/uploads/201407/26/1406383290_1042.jpg","https://img-my.csdn.net/uploads/201407/26/1406383275_3977.jpg","https://img-my.csdn.net/uploads/201407/26/1406383265_8550.jpg",

……

那么我们在MainActivity中就能够导入这些图像了:
package com.imooc.listviewacyncloader;import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;import java.util.Arrays;
import java.util.List;public class MainActivity extends Activity {private ListView mListView;private List<String> mData;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mListView = (ListView) findViewById(R.id.lv);mData = Arrays.asList(Images.IMAGE_URLS);mListView.setAdapter(……);}
}

測试图像搞定~我们后面继续~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我的Github
我的视频 慕课网

Android异步载入全解析之开篇瞎扯淡相关推荐

  1. 2011 CES主角:Android 3.0全解析

    作者: | 出处:搜狐数码 | 2011-01-10 09:28:32 | 阅读 次 并且在作用了10.1英寸的屏幕之上,分辨率达到了笔记本电脑1280×800像素的水平,Android 3.0蜂窝系 ...

  2. Android系统启动过程全解析

    Android系统是一款基于Linux的移动操作系统,那么Android是如何启动起来的呢?本文就详细阐述Android系统的启动过程. 从内核之上,我们首先应该从文件系统的init开始,因为 ini ...

  3. Android 屏幕旋转 全解析

    屏幕旋转一般的解决方案 关于屏幕旋转这里,之前一直没太注意,因为根据设备会有指定的屏幕旋转策略如: 开发手机应用时一直使用强制竖屏布局 开发平板设备一直使用横屏布局 开发系统应用,一般给两套即横竖各一 ...

  4. 一篇好文之Android数据库 SQLite全解析

    项目效果地址: SQlite 1. 创建数据库 Android中使用SQlite,需要自己创建库,建表,添加数据!好在Android中提供了SQLiteOpenHelper类来帮助创建使用数据库,我们 ...

  5. Android 主题设计全解析

    Android主题设计!有点乱? 初学Android的时候对Android的主题设计都是处在一种模糊的认知状态,为啥呢? 自定义时候的attr,普通view的style属性,activity以及app ...

  6. Android操作Exif-ExifInterface全解析

    简介: Exif是一种图像文件格式,它的数据存储与JPEG格式是完全相同的.实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈.快门.白平衡.ISO.焦距.日期时间等各种和 ...

  7. 刷机必知 Android HBOOT命令全解析

    Android手机可以给我们带来的乐趣,体现在方方面面,随处可刷的ROM!同样的,刷ROM也是一项Android具备的独特功能,但作为刷ROM的前提条件,我们首先要了解手机的各项特征,接下来,我们就进 ...

  8. Android异步加载全解析之引入二级缓存

    Android异步加载全解析之引入二级缓存 为啥要二级缓存 前面我们有了一级缓存,为啥还要二级缓存呢?说白了,这就和电脑是一样的,我们电脑有内存和硬盘,内存读取速度快,所以CPU直接读取内存中的数据, ...

  9. Android异步消息处理机制 全解析

    Android异步消息处理机制主要是指Handler的运行机制以及Hanlder所附带的MessageQueue和Looper的工作过程. 本文将通过分析源码(api-28)的形式,全面解析Handl ...

  10. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53939176 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

最新文章

  1. CodeChef--SEPT14小结
  2. 图标化java_java最小化到托盘显示图标实现
  3. scikit-image安装 from numpy.lib.arraypad import _validate_lengths ImportError: cannot import name ‘_va
  4. 小米10的Android安全更新,MIUI 12首批更新名单被曝光,小米10系列优先上Android 11...
  5. rf中resourceid_解决VC++ MFC程序resource.h头文件中ID重复问题
  6. c#做端口转发程序支持正向连接和反向链接
  7. 小干货:Linux 系统的备份恢复
  8. Mysql漏洞修复方法思路及注意事项
  9. Spring Boot入门HelloWorld
  10. 新人进群发邮件软件,QQ群潜伏发邮件软件,一进群就收到邮件软件
  11. 兄弟连 40 期 临行时刻
  12. Service phantomjs unexpectedly exited. Status code was: 1
  13. Python pgm解析和格式转换
  14. vant-swipe自适应图片高度+图片预览
  15. LCD显示屏与OLED屏幕对比分析
  16. 【硬件篇】显卡五连问
  17. elasticsearch定时删除过期索引index
  18. 应用系统安全规范-自己想到和网络搜索到的点子记录整合一下
  19. webpack entry入口
  20. 流行和声(3)minor6和弦

热门文章

  1. org.apache.jasper.JasperException: /index.jsp(14,2) The s:form tag declares that it accepts dyna
  2. (转)ApplicationDomain
  3. [IOS, Android] UI Thread的一些思想
  4. Linux上运行Python文件
  5. 【汇总目录】嵌入式系统技术
  6. [Swift]LeetCode306. 累加数 | Additive Number
  7. Python入门2(Python与C语言语法的不同、Notepad++运行Python代码)
  8. Sublime text 3 注册码激活码 版本号3143
  9. PackageManager.getPackageSizeInfo||UserHandle.myUserId()
  10. 科罗拉多州立大学计算机优势,盘点科罗拉多州立大学优势专业主要看排行榜