Android异步载入

概述

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

怎样下载图像

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

HttpURLConnection

  1. private static Bitmap getBitmapFromUrl(String urlString) {
  2. Bitmap bitmap;
  3. InputStream is = null;
  4. try {
  5. URL url = new URL(urlString);
  6. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  7. is = new BufferedInputStream(conn.getInputStream());
  8. bitmap = BitmapFactory.decodeStream(is);
  9. conn.disconnect();
  10. return bitmap;
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. } finally {
  14. try {
  15. if (is != null)
  16. is.close();
  17. } catch (IOException e) {
  18. }
  19. }
  20. return null;
  21. }

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

Drawable

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

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

ListView

这一篇作为开篇。我们还是来扯下淡,这个ListView,大家都用过,最经常使用的优化也就是使用ViewHolder模式进行复用,避免反复的inflate和findViewById而影响效率,相信大部分的开发人员都已经熟知,这里我们还是贴下Adapter的代码:
  1. package com.imooc.listviewacyncloader;
  2.  
  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.BaseAdapter;
  8. import android.widget.ImageView;
  9.  
  10. import java.util.List;
  11.  
  12. public class MyAdapterNotUseCaches extends BaseAdapter {
  13.  
  14. private LayoutInflater mInflater;
  15. private List<String> mData;
  16.  
  17. public MyAdapterNotUseCaches(Context context, List<String> data) {
  18. this.mData = data;
  19. mInflater = LayoutInflater.from(context);
  20. }
  21.  
  22. @Override
  23. public int getCount() {
  24. return mData.size();
  25. }
  26.  
  27. @Override
  28. public Object getItem(int position) {
  29. return mData.get(position);
  30. }
  31.  
  32. @Override
  33. public long getItemId(int position) {
  34. return position;
  35. }
  36.  
  37. @Override
  38. public View getView(int position, View convertView, ViewGroup parent) {
  39. String url = mData.get(position);
  40. ViewHolder viewHolder = null;
  41. if (convertView == null) {
  42. viewHolder = new ViewHolder();
  43. convertView = mInflater.inflate(R.layout.listview_item, null);
  44. viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_lv_item);
  45. convertView.setTag(viewHolder);
  46. } else {
  47. viewHolder = (ViewHolder) convertView.getTag();
  48. }
  49. viewHolder.imageView.setTag(url);
  50. viewHolder.imageView.setImageResource(R.drawable.ic_launcher);
  51. return convertView;
  52. }
  53.  
  54. public class ViewHolder{
  55. public ImageView imageView;
  56. }
  57. }

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

  1. viewHolder.imageView.setTag(url);

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

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

图像

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

……

那么我们在MainActivity中就能够导入这些图像了:
  1. package com.imooc.listviewacyncloader;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.widget.ListView;
  6.  
  7. import java.util.Arrays;
  8. import java.util.List;
  9.  
  10. public class MainActivity extends Activity {
  11.  
  12. private ListView mListView;
  13. private List<String> mData;
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. mListView = (ListView) findViewById(R.id.lv);
  20. mData = Arrays.asList(Images.IMAGE_URLS);
  21. mListView.setAdapter(……);
  22. }
  23. }

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

我的Github 我的视频 慕课网

Android异步载入全解析之开篇瞎扯淡的更多相关文章

  1. Android异步载入全解析之使用多线程

    异步载入之使用多线程 初次尝试 异步.异步,事实上说白了就是多任务处理.也就是多线程执行.多线程那就会有各种问题,我们一步步来看.首先.我们创建一个class--ImageLoaderWithoutC ...

  2. Android异步载入全解析之IntentService

    Android异步载入全解析之IntentService 搞什么IntentService 前面我们说了那么多,异步处理都使用钦定的AsyncTask.再不济也使用的Thread,那么这个Intent ...

  3. Android异步载入全解析之大图处理

    Android异步载入全解析之大图处理 异步载入中很重要的一部分就是对图像的处理,这也是我们前面用异步载入图像做示例的原因. 一方面是由于图像处理不好的话会很占内存,并且easyOOM,还有一方面,图 ...

  4. Android异步载入全解析之使用AsyncTask

    Android异步载入全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅能够对并发线程进行管理.更能够提高他们运行的效率.优化整个App.当然我们能够自己 ...

  5. Android异步载入AsyncTask具体解释

    曾看见有人说过.认为非常有道理.分享一下:   技术分为术和道两种:   (1)具体做事的方法是术.   (2)做事的原理和原则是道. 近期项目发现个重大问题.结果打log跟踪查是AsyncTask导 ...

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

    Android 中的异步消息处理主要由四个部分组成,Message.Handler.MessageQueue.Looper.下面将会对这四个部分进行一下简要的介绍. 1. Message: Messa ...

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

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

  8. Android异步载入学习笔记之四:利用缓存优化网络载入图片及ListView载入优化

    假设不做不论什么处理.直接用网络载入图片在网速快的情况下可能没什么不好的感觉.可是假设使用移动流量或是网络不好的时候.问题就来了,要么用户会抱怨流量使用太多.要么抱怨图片载入太慢.如论从哪个角度出发, ...

  9. Eclipse,到了说再见的时候了——Android Studio最全解析

    转自:http://blog.jobbole.com/77635/ 去年的Google大会上,Google带给我们一个小玩具——Android Studio,说它是玩具,是因为它确实比较菜,界面过时, ...

随机推荐

  1. thread.h

    https://github.com/wookayin/pintos/blob/master/src/threads/thread.h #ifndef THREADS_THREAD_H   #defi ...

  2. mysql插入数据出现java.lang.NullPointerException

    在写购物车持久层的时候,要进行测试的时候居然出现了空指针异常: 最后发现是测试类少了 @RunWith(SpringRunner.class)@SpringBootTest 如下是没改之前的测试类: ...

  3. VC++ 借助 Win32 API 绘图实现基本的细胞自动机演示

    //本程序使用 Visual Studio 2015 生成的 Win32 窗口程序模板 开发//使用 Win32 API 绘图//实现基本的细胞自动机演示////目前已知问题://存在内存泄漏,但具体 ...

  4. 【jQuery01】添加添加div

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 题解 洛谷 P1580 【yyy loves Easter_Egg I】

    一言不合上代码: #include<cstdio> #include<cstring> ],bz[],dmz[]; int maohao,xf,ls,sss,lll,xxf,x ...

  6. 为什么不能往Android的Application对象里存储数据

    在一个App里面总有一些数据需要在多个地方用到.这些数据可能是一个 session token,一次费时计算的结果等.通常为了避免activity之间传递对象的开销 ,这些数据一般都会保存到持久化存储 ...

  7. OC中的@的作用研究

    OC中的@字符用的频率很的高,其主要作用是为了差别于其它语言的keyword和语法 以下我们来研究一下其应用 1.声明类,协议,延展,权限,属性等 @interface声明类 @protocol声明协 ...

  8. C++字节对齐与结构体大小计算

    转载注明出处:http://pppboy.blog.163.com/blog/static/30203796201082494026399/ 感谢原创博主的辛勤成果. 说明: 结构体的sizeof值, ...

  9. idea报错。Error:Failed to load project configuration: cannot parse xml file E:\project\.idea\workspace.xml: Error on line 1: 前言中不允许有内容。

    因为电脑卡死强制重启电脑后打开idea,进行junit单元测试报错: idea报错.Error:Failed to load project configuration: cannot parse x ...

  10. mysql语句判断一天操作记录的个数

    话说有一文章表article,存储文章的添加文章的时间是add_time字段,该字段为int(5)类型的,现需要查询今天添加的文章总数并且按照时间从大到小排序,则查询语句如下: 1    select ...