前言:本以为异步加载挺简单,因为网上代码多,但真想要做好,还真不那么简单,从看代码到弄懂再到自己写,实在是有太多的东西需要学了,用了两天的时间,终于弄出来了,因为用到回调函数,所以理解起来可能难度有点大,讲起来也不太好讲,我尽力讲的明白些,其实还是要多看代码,自己摸索摸索,动手写写就什么都理解了。这篇我们只讲怎样实现异步加载,对于滑动时停止加载的事下篇再讲。

实现效果:

1、异步加载图片,在加载图片时,先加载一个默认的图片,然后在后台加载图片,加载完成后显示出来;

2、当用户在滑动时,停止加载图片的线程,当停止滑动时,看哪几个ITEM在显示屏内,只加载这几个,其它线程保持阻止;(下篇再讲)

效果图:

刚开始加载时                          向下划动(新划出来的是空白块)           停划,加载完成

   

一、XML

1、main.xml

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <ListView android:id="@+id/list"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent" />
  10. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" />
</LinearLayout>

2、列表子项XML(book_item_adapter.xml)

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="70.0dip"
  5. android:background="@drawable/item"
  6. android:drawingCacheQuality="high"
  7. android:minHeight="70.0dip"
  8. android:orientation="horizontal" >
  9. <ImageView
  10. android:id="@+id/sItemIcon"
  11. android:layout_width="42.0dip"
  12. android:layout_height="54.0dip"
  13. android:layout_margin="10.0dip"
  14. android:background="@drawable/rc_item_bg"
  15. android:padding="2.0dip"
  16. android:scaleType="fitXY" />
  17. <TextView
  18. android:text="斗破苍穹"
  19. android:id="@+id/sItemTitle"
  20. android:layout_width="fill_parent"
  21. android:layout_height="30.0dip"
  22. android:layout_alignTop="@+id/sItemIcon"
  23. android:layout_toRightOf="@+id/sItemIcon"
  24. android:gravity="center_vertical"
  25. android:singleLine="true"
  26. android:textColor="#ffffff"
  27. android:textSize="18.0sp" />
  28. </RelativeLayout>
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="70.0dip"android:background="@drawable/item"android:drawingCacheQuality="high"android:minHeight="70.0dip"android:orientation="horizontal" ><ImageViewandroid:id="@+id/sItemIcon"android:layout_width="42.0dip"android:layout_height="54.0dip"android:layout_margin="10.0dip"android:background="@drawable/rc_item_bg"android:padding="2.0dip"android:scaleType="fitXY" /><TextViewandroid:text="斗破苍穹"android:id="@+id/sItemTitle"android:layout_width="fill_parent"android:layout_height="30.0dip"android:layout_alignTop="@+id/sItemIcon"android:layout_toRightOf="@+id/sItemIcon"android:gravity="center_vertical"android:singleLine="true"android:textColor="#ffffff"android:textSize="18.0sp" />
</RelativeLayout>

二、JAVA代码

1、主页面代码(AsyncListImage.java)

[java] view plaincopyprint?
  1. package cn.wangmeng.test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.widget.ListView;
  7. public class AsyncListImage extends Activity {
  8. private ListView list;
  9. @Override
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. list=(ListView)findViewById(R.id.list);
  14. List<ImageAndText> dataArray=new ArrayList<ImageAndText>();
  15. for (int i = 0; i < 100; i++) {
  16. ImageAndText test=new ImageAndText("http://www.wangmeng.cn/images/logo.gif", "test");
  17. ImageAndText test1=new ImageAndText("http://www.pfwx.com/files/article/image/0/54/54s.jpg", "test1");
  18. ImageAndText test2=new ImageAndText("http://www.pfwx.com/files/article/image/0/4/4s.jpg","test2");
  19. ImageAndText test3=new ImageAndText("http://www.pfwx.com/files/article/image/9/9760/9760s.jpg","test3");
  20. ImageAndText test4=new ImageAndText("http://www.pfwx.com/files/article/image/3/3382/3382s.jpg","test4");
  21. ImageAndText test5=new ImageAndText("http://www.pfwx.com/files/article/image/3/3237/3237s.jpg","test5");
  22. dataArray.add(test);
  23. dataArray.add(test1);
  24. dataArray.add(test2);
  25. dataArray.add(test3);
  26. dataArray.add(test4);
  27. dataArray.add(test5);
  28. }
  29. ImageAndTextListAdapter adapter=new ImageAndTextListAdapter(this, dataArray, list);
  30. list.setAdapter(adapter);
  31. }
  32. }
package cn.wangmeng.test;import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;public class AsyncListImage extends Activity {private ListView list;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);list=(ListView)findViewById(R.id.list);List<ImageAndText> dataArray=new ArrayList<ImageAndText>();for (int i = 0; i < 100; i++) {ImageAndText test=new ImageAndText("http://www.wangmeng.cn/images/logo.gif", "test");ImageAndText test1=new ImageAndText("http://www.pfwx.com/files/article/image/0/54/54s.jpg", "test1");ImageAndText test2=new ImageAndText("http://www.pfwx.com/files/article/image/0/4/4s.jpg","test2");ImageAndText test3=new ImageAndText("http://www.pfwx.com/files/article/image/9/9760/9760s.jpg","test3");ImageAndText test4=new ImageAndText("http://www.pfwx.com/files/article/image/3/3382/3382s.jpg","test4");ImageAndText test5=new ImageAndText("http://www.pfwx.com/files/article/image/3/3237/3237s.jpg","test5");dataArray.add(test);dataArray.add(test1);dataArray.add(test2);    dataArray.add(test3);   dataArray.add(test4);   dataArray.add(test5);   }ImageAndTextListAdapter adapter=new ImageAndTextListAdapter(this, dataArray, list);list.setAdapter(adapter);}
}

2、ImageAndText.java

[java] view plaincopyprint?
  1. package cn.wangmeng.test;
  2. public class ImageAndText {
  3. private String imageUrl;
  4. private String text;
  5. public ImageAndText(String imageUrl, String text) {
  6. this.imageUrl = imageUrl;
  7. this.text = text;
  8. }
  9. public String getImageUrl() {
  10. return imageUrl;
  11. }
  12. public String getText() {
  13. return text;
  14. }
  15. }
package cn.wangmeng.test;public class ImageAndText {private String imageUrl;private String text;public ImageAndText(String imageUrl, String text) {this.imageUrl = imageUrl;this.text = text;}public String getImageUrl() {return imageUrl;}public String getText() {return text;}
}

上面两个代码一块讲 1、ImageAndText类是用来存储要与XML绑定的图片地址和名字地址的。

2、将所有的地址都放在一个List里面(dataArray),然后将其传入ImageAndTextListAdapter()函数中;可见这个ImageAndTextListAdapter()函数是根据传进去的dataArray生成对应的Adapter的

3、然后将ImageAndTextListAdapter()返回的Adapter与listView绑定

3、ImageAndTextListAdapter.java

这是重写于baseAdapter的类,由于重写于baseAdapter,所以有几个必须重写的函数,getCount()、getItem()、getItemId()、getView(),我们先把总体代码写出来,只讲一个getView()函数,其实函数就不讲了,先着重说下getView()函数在什么时候被系统调用:

getView()函数在什么时候被系统调用:

注意一点是android系统在显示列表时,并不是把所有代表都显示出来,让你随便划,划到哪是哪;而是根据当前的在划到的ITEM,调用当前ITEM的getView()来显示它。

全部代码:

[java] view plaincopyprint?
  1. package cn.wangmeng.test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import cn.wangmeng.test.AsyncImageLoader.ImageCallback;
  5. import android.app.Activity;
  6. import android.graphics.drawable.Drawable;
  7. import android.util.Log;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11. import android.widget.ArrayAdapter;
  12. import android.widget.BaseAdapter;
  13. import android.widget.ImageView;
  14. import android.widget.ListView;
  15. import android.widget.TextView;
  16. public class ImageAndTextListAdapter extends BaseAdapter {
  17. private LayoutInflater inflater;
  18. private ListView listView;
  19. private AsyncImageLoader asyncImageLoader;
  20. private List<ImageAndText> dataArray=new ArrayList<ImageAndText>();
  21. public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts, ListView listView) {
  22. this.listView = listView;
  23. asyncImageLoader = new AsyncImageLoader();
  24. inflater = activity.getLayoutInflater();
  25. dataArray=imageAndTexts;
  26. }
  27. @Override
  28. public int getCount() {
  29. // TODO Auto-generated method stub
  30. return dataArray.size();
  31. }
  32. @Override
  33. public Object getItem(int position) {
  34. // TODO Auto-generated method stub
  35. if(position >= getCount()){
  36. return null;
  37. }
  38. return dataArray.get(position);
  39. }
  40. @Override
  41. public long getItemId(int position) {
  42. // TODO Auto-generated method stub
  43. return position;
  44. }
  45. //不需要ViewHolder版,直接将ImageAndText与XML资源关联起来
  46. public View getView(int position, View convertView, ViewGroup parent) {
  47. if (convertView == null) {
  48. convertView = inflater.inflate(R.layout.book_item_adapter, null);
  49. }
  50. convertView.setTag(position);
  51. ImageAndText imageAndText = (ImageAndText) getItem(position);
  52. String imageUrl = imageAndText.getImageUrl();
  53. TextView textView =  (TextView) convertView.findViewById(R.id.sItemTitle);
  54. // 将XML视图项与用户输入的URL和文本在绑定
  55. textView.setText(imageAndText.getText());//加载TEXT
  56. ImageView iv = (ImageView) convertView.findViewById(R.id.sItemIcon);
  57. iv.setBackgroundResource(R.drawable.rc_item_bg);//在初始化时,先把背景图片设置成默认背景,
  58. //否则在下拉时会随机匹配背景,不美观
  59. asyncImageLoader.loadDrawable(position,imageUrl, new ImageCallback() {
  60. @Override
  61. public void onImageLoad(Integer pos, Drawable drawable) {
  62. View view = listView.findViewWithTag(pos);
  63. if(view != null){
  64. ImageView iv = (ImageView) view.findViewById(R.id.sItemIcon);
  65. iv.setBackgroundDrawable(drawable);
  66. }
  67. }
  68. //加载不成功的图片处理
  69. @Override
  70. public void onError(Integer pos) {
  71. View view = listView.findViewWithTag(pos);
  72. if(view != null){
  73. ImageView iv = (ImageView) view.findViewById(R.id.sItemIcon);
  74. iv.setBackgroundResource(R.drawable.rc_item_bg);
  75. }
  76. }
  77. });
  78. return convertView;
  79. }
  80. }
package cn.wangmeng.test;import java.util.ArrayList;
import java.util.List;import cn.wangmeng.test.AsyncImageLoader.ImageCallback;import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;public class ImageAndTextListAdapter extends BaseAdapter {private LayoutInflater inflater;private ListView listView;private AsyncImageLoader asyncImageLoader;private List<ImageAndText> dataArray=new ArrayList<ImageAndText>();public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts, ListView listView) {this.listView = listView;asyncImageLoader = new AsyncImageLoader();inflater = activity.getLayoutInflater();dataArray=imageAndTexts;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn dataArray.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubif(position >= getCount()){return null;}return dataArray.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}//不需要ViewHolder版,直接将ImageAndText与XML资源关联起来public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = inflater.inflate(R.layout.book_item_adapter, null);}convertView.setTag(position);ImageAndText imageAndText = (ImageAndText) getItem(position);String imageUrl = imageAndText.getImageUrl();TextView textView =  (TextView) convertView.findViewById(R.id.sItemTitle); // 将XML视图项与用户输入的URL和文本在绑定textView.setText(imageAndText.getText());//加载TEXTImageView iv = (ImageView) convertView.findViewById(R.id.sItemIcon);iv.setBackgroundResource(R.drawable.rc_item_bg);//在初始化时,先把背景图片设置成默认背景,//否则在下拉时会随机匹配背景,不美观asyncImageLoader.loadDrawable(position,imageUrl, new ImageCallback() {@Overridepublic void onImageLoad(Integer pos, Drawable drawable) {View view = listView.findViewWithTag(pos);if(view != null){ImageView iv = (ImageView) view.findViewById(R.id.sItemIcon);iv.setBackgroundDrawable(drawable);}}//加载不成功的图片处理    @Overridepublic void onError(Integer pos) {View view = listView.findViewWithTag(pos);if(view != null){ImageView iv = (ImageView) view.findViewById(R.id.sItemIcon);iv.setBackgroundResource(R.drawable.rc_item_bg);}}});return convertView;}
}

我们着重看getView()函数 1、看这段:

[java] view plaincopyprint?
  1. if (convertView == null) {
  2. convertView = inflater.inflate(R.layout.book_item_adapter, null);
  3. }
  4. convertView.setTag(position);
  5. ImageAndText imageAndText = (ImageAndText) getItem(position);
  6. String imageUrl = imageAndText.getImageUrl();
  7. TextView textView =  (TextView) convertView.findViewById(R.id.sItemTitle);
  8. // 将XML视图项与用户输入的URL和文本在绑定
  9. textView.setText(imageAndText.getText());//加载TEXT
  10. ImageView iv = (ImageView) convertView.findViewById(R.id.sItemIcon);
  11. iv.setBackgroundResource(R.drawable.rc_item_bg);
if (convertView == null) {convertView = inflater.inflate(R.layout.book_item_adapter, null);
}
convertView.setTag(position);ImageAndText imageAndText = (ImageAndText) getItem(position);
String imageUrl = imageAndText.getImageUrl();TextView textView =  (TextView) convertView.findViewById(R.id.sItemTitle);
// 将XML视图项与用户输入的URL和文本在绑定
textView.setText(imageAndText.getText());//加载TEXT
ImageView iv = (ImageView) convertView.findViewById(R.id.sItemIcon);
iv.setBackgroundResource(R.drawable.rc_item_bg);

这段代码没什么特别的就是将前面dataArray的信息与XML的元素项对应起来,并绑定,最关键的是下面这段,下面这个方法才是实现异步加载图片的关键:

[java] view plaincopyprint?
  1. asyncImageLoader.loadDrawable(position,imageUrl, new ImageCallback() {
  2. @Override
  3. public void onImageLoad(Integer pos, Drawable drawable) {
  4. View view = listView.findViewWithTag(pos);
  5. if(view != null){
  6. ImageView iv = (ImageView) view.findViewById(R.id.sItemIcon);
  7. iv.setBackgroundDrawable(drawable);
  8. }
  9. }
  10. //加载不成功的图片处理
  11. @Override
  12. public void onError(Integer pos) {
  13. View view = listView.findViewWithTag(pos);
  14. if(view != null){
  15. ImageView iv = (ImageView) view.findViewById(R.id.sItemIcon);
  16. iv.setBackgroundResource(R.drawable.rc_item_bg);
  17. }
  18. }
  19. });
asyncImageLoader.loadDrawable(position,imageUrl, new ImageCallback() {@Overridepublic void onImageLoad(Integer pos, Drawable drawable) {View view = listView.findViewWithTag(pos);if(view != null){ImageView iv = (ImageView) view.findViewById(R.id.sItemIcon);iv.setBackgroundDrawable(drawable);}}//加载不成功的图片处理 @Overridepublic void onError(Integer pos) {View view = listView.findViewWithTag(pos);if(view != null){ImageView iv = (ImageView) view.findViewById(R.id.sItemIcon);iv.setBackgroundResource(R.drawable.rc_item_bg);}}});

这段代码的奇特之处在于,利用AsyncImageLoader类的实例(asyncImageLoader),调用方法loadDrawable()方法,就实现了加载后图像的绑定;好神奇,仔细看他是怎么做到的。这里先注意的有两点: (1)、传进去的参数,当前项的位置(position),当前图片的URL(imageUrl),一个名称为ImageCallback()接口函数;

(2)、ImageCallback()接口函数里的两个被重写的函数onImageLoad()和onError()

3、AsyncImageLoader.java

从上面的讲解也应该能猜到这个类,主要的功能就是加载图片,然后成功后更新UI;

先看全部代码,然后再逐步讲

[java] view plaincopyprint?
  1. package cn.wangmeng.test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.lang.ref.SoftReference;
  5. import java.net.URL;
  6. import java.util.HashMap;
  7. import android.graphics.drawable.Drawable;
  8. import android.os.Handler;
  9. public class AsyncImageLoader {
  10. final Handler handler = new Handler();
  11. private HashMap<String, SoftReference<Drawable>> imageCache;
  12. public AsyncImageLoader() {
  13. imageCache = new HashMap<String, SoftReference<Drawable>>();//图片缓存
  14. }
  15. // 回调函数
  16. public interface ImageCallback {
  17. public void onImageLoad(Integer t, Drawable drawable);
  18. public void onError(Integer t);
  19. }
  20. public Drawable loadDrawable(final Integer pos, final String imageUrl,
  21. final ImageCallback imageCallback) {
  22. new Thread() {
  23. @Override
  24. public void run() {
  25. LoadImg(pos, imageUrl, imageCallback);
  26. }
  27. }.start();
  28. return null;
  29. }// loadDrawable---end
  30. public void LoadImg(final Integer pos, final String imageUrl,
  31. final ImageCallback imageCallback) {
  32. // 首先判断是否在缓存中
  33. // 但有个问题是:ImageCache可能会越来越大,以至用户内存用光,所以要用SoftReference(弱引用)来实现
  34. if (imageCache.containsKey(imageUrl)) {
  35. SoftReference<Drawable> softReference = imageCache.get(imageUrl);
  36. final Drawable drawable = softReference.get();
  37. if (drawable != null) {
  38. handler.post(new Runnable() {
  39. @Override
  40. public void run() {
  41. imageCallback.onImageLoad(pos, drawable);
  42. }
  43. });
  44. return;
  45. }
  46. }
  47. // 尝试从URL中加载
  48. try {
  49. final Drawable drawable = loadImageFromUrl(imageUrl);
  50. if (drawable != null) {
  51. imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
  52. }
  53. handler.post(new Runnable() {
  54. @Override
  55. public void run() {
  56. imageCallback.onImageLoad(pos, drawable);
  57. }
  58. });
  59. } catch (IOException e) {
  60. handler.post(new Runnable() {
  61. @Override
  62. public void run() {
  63. imageCallback.onError(pos);
  64. }
  65. });
  66. e.printStackTrace();
  67. }
  68. }
  69. // 根据URL加载图片,如果出现错误throws IOException式的错误,以便在LoadImg中捕获,执行OnError()函数
  70. public static Drawable loadImageFromUrl(String url) throws IOException {
  71. URL m;
  72. InputStream i = null;
  73. m = new URL(url);
  74. i = (InputStream) m.getContent();
  75. Drawable d = Drawable.createFromStream(i, "src");
  76. return d;
  77. }
  78. }
package cn.wangmeng.test;import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;import android.graphics.drawable.Drawable;
import android.os.Handler;public class AsyncImageLoader {final Handler handler = new Handler();private HashMap<String, SoftReference<Drawable>> imageCache;public AsyncImageLoader() {imageCache = new HashMap<String, SoftReference<Drawable>>();//图片缓存}// 回调函数public interface ImageCallback {public void onImageLoad(Integer t, Drawable drawable);public void onError(Integer t);}public Drawable loadDrawable(final Integer pos, final String imageUrl,final ImageCallback imageCallback) {new Thread() {@Overridepublic void run() {LoadImg(pos, imageUrl, imageCallback);}}.start();return null;}// loadDrawable---endpublic void LoadImg(final Integer pos, final String imageUrl,final ImageCallback imageCallback) {// 首先判断是否在缓存中// 但有个问题是:ImageCache可能会越来越大,以至用户内存用光,所以要用SoftReference(弱引用)来实现if (imageCache.containsKey(imageUrl)) {SoftReference<Drawable> softReference = imageCache.get(imageUrl);final Drawable drawable = softReference.get();if (drawable != null) {handler.post(new Runnable() {@Overridepublic void run() {imageCallback.onImageLoad(pos, drawable);}});return;}}// 尝试从URL中加载try {final Drawable drawable = loadImageFromUrl(imageUrl);if (drawable != null) {imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));}handler.post(new Runnable() {@Overridepublic void run() {imageCallback.onImageLoad(pos, drawable);}});} catch (IOException e) {handler.post(new Runnable() {@Overridepublic void run() {imageCallback.onError(pos);}});e.printStackTrace();}}// 根据URL加载图片,如果出现错误throws IOException式的错误,以便在LoadImg中捕获,执行OnError()函数public static Drawable loadImageFromUrl(String url) throws IOException {URL m;InputStream i = null;m = new URL(url);i = (InputStream) m.getContent();Drawable d = Drawable.createFromStream(i, "src");return d;}}

分别讲解 1、先看这段代码

[java] view plaincopyprint?
  1. // 回调函数
  2. public interface ImageCallback {
  3. public void onImageLoad(Integer t, Drawable drawable);
  4. public void onError(Integer t);
  5. }
  6. public Drawable loadDrawable(final Integer pos, final String imageUrl,
  7. final ImageCallback imageCallback) {
  8. new Thread() {
  9. @Override
  10. public void run() {
  11. LoadImg(pos, imageUrl, imageCallback);
  12. }
  13. }.start();
  14. return null;
  15. }// loadDrawable---end
    // 回调函数public interface ImageCallback {public void onImageLoad(Integer t, Drawable drawable);public void onError(Integer t);}public Drawable loadDrawable(final Integer pos, final String imageUrl,final ImageCallback imageCallback) {new Thread() {@Overridepublic void run() {LoadImg(pos, imageUrl, imageCallback);}}.start();return null;}// loadDrawable---end

(1)首先注意,刚才我们调用的loadDrawable()函数,里面初始化并运行了一个线程,而这个线程的里面只有一个函数LoadImg(),对于这个函数下面我们具体讲,它的主要功能就是加载图片,然后更新UI (2)上面也看出了ImageCallback是一个接口,而里面的两个函数onImageLoad()和onError()在这里是没有具体实现的,那在哪里实现呢,当然是我们上面的ImageAndTextListAdapter.java里面了,等下我们具体会再讲。

再往下看

[java] view plaincopyprint?
  1. // 根据URL加载图片,如果出现错误throws IOException式的错误,以便在LoadImg中捕获,执行OnError()函数
  2. public static Drawable loadImageFromUrl(String url) throws IOException {
  3. URL m;
  4. InputStream i = null;
  5. m = new URL(url);
  6. i = (InputStream) m.getContent();
  7. Drawable d = Drawable.createFromStream(i, "src");
  8. return d;
  9. }
  10. public void LoadImg(final Integer pos, final String imageUrl,
  11. final ImageCallback imageCallback) {
  12. // 首先判断是否在缓存中
  13. // 但有个问题是:ImageCache可能会越来越大,以至用户内存用光,所以要用SoftReference(弱引用)来实现
  14. if (imageCache.containsKey(imageUrl)) {
  15. SoftReference<Drawable> softReference = imageCache.get(imageUrl);
  16. final Drawable drawable = softReference.get();
  17. if (drawable != null) {
  18. handler.post(new Runnable() {
  19. @Override
  20. public void run() {
  21. imageCallback.onImageLoad(pos, drawable);
  22. }
  23. });
  24. return;
  25. }
  26. }
  27. // 尝试从URL中加载
  28. try {
  29. final Drawable drawable = loadImageFromUrl(imageUrl);
  30. if (drawable != null) {
  31. imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
  32. }
  33. handler.post(new Runnable() {
  34. @Override
  35. public void run() {
  36. imageCallback.onImageLoad(pos, drawable);
  37. }
  38. });
  39. } catch (IOException e) {
  40. handler.post(new Runnable() {
  41. @Override
  42. public void run() {
  43. imageCallback.onError(pos);
  44. }
  45. });
  46. e.printStackTrace();
  47. }
  48. }
  // 根据URL加载图片,如果出现错误throws IOException式的错误,以便在LoadImg中捕获,执行OnError()函数public static Drawable loadImageFromUrl(String url) throws IOException {URL m;InputStream i = null;m = new URL(url);i = (InputStream) m.getContent();Drawable d = Drawable.createFromStream(i, "src");return d;}public void LoadImg(final Integer pos, final String imageUrl,final ImageCallback imageCallback) {// 首先判断是否在缓存中// 但有个问题是:ImageCache可能会越来越大,以至用户内存用光,所以要用SoftReference(弱引用)来实现if (imageCache.containsKey(imageUrl)) {SoftReference<Drawable> softReference = imageCache.get(imageUrl);final Drawable drawable = softReference.get();if (drawable != null) {handler.post(new Runnable() {@Overridepublic void run() {imageCallback.onImageLoad(pos, drawable);}});return;}}// 尝试从URL中加载try {final Drawable drawable = loadImageFromUrl(imageUrl);if (drawable != null) {imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));}handler.post(new Runnable() {@Overridepublic void run() {imageCallback.onImageLoad(pos, drawable);}});} catch (IOException e) {handler.post(new Runnable() {@Overridepublic void run() {imageCallback.onError(pos);}});e.printStackTrace();}}

(1)、loadImageFromUrl()函数,就是根据URL到网上加载图片,然后返回图片流Drawable类型变量 (2)、对于LoadImg()我们再拆一下,先看如何在缓存中加载

[java] view plaincopyprint?
  1. if (imageCache.containsKey(imageUrl)) {
  2. SoftReference<Drawable> softReference = imageCache.get(imageUrl);
  3. final Drawable drawable = softReference.get();
  4. if (drawable != null) {
  5. handler.post(new Runnable() {
  6. @Override
  7. public void run() {
  8. imageCallback.onImageLoad(pos, drawable);
  9. }
  10. });
  11. return;
  12. }
  13. }
        if (imageCache.containsKey(imageUrl)) {SoftReference<Drawable> softReference = imageCache.get(imageUrl);final Drawable drawable = softReference.get();if (drawable != null) {handler.post(new Runnable() {@Overridepublic void run() {imageCallback.onImageLoad(pos, drawable);}});return;}}

注意:

1、在这里就已经得到了图像

[java] view plaincopyprint?
  1. SoftReference<Drawable> softReference = imageCache.get(imageUrl);
  2. final Drawable drawable = softReference.get();
           SoftReference<Drawable> softReference = imageCache.get(imageUrl);final Drawable drawable = softReference.get();

2、得到图像之后就到了这段代码:

[java] view plaincopyprint?
  1. if (drawable != null) {
  2. handler.post(new Runnable() {
  3. @Override
  4. public void run() {
  5. imageCallback.onImageLoad(pos, drawable);
  6. }
  7. });
  8. return;
  9. }
            if (drawable != null) {handler.post(new Runnable() {@Overridepublic void run() {imageCallback.onImageLoad(pos, drawable);}});return;}

当我们得到图像之后,调用imageCallback.onImageLoad(pos, drawable);来更新UI,由于我们再回来看看ImageAndTextListAdapter.java中的代码

[java] view plaincopyprint?
  1. asyncImageLoader.loadDrawable(position,imageUrl, new ImageCallback() {
  2. @Override
  3. public void onImageLoad(Integer pos, Drawable drawable) {
  4. View view = listView.findViewWithTag(pos);
  5. if(view != null){
  6. ImageView iv = (ImageView) view.findViewById(R.id.sItemIcon);
  7. iv.setBackgroundDrawable(drawable);
  8. }
  9. }
  10. });
asyncImageLoader.loadDrawable(position,imageUrl, new ImageCallback() {@Overridepublic void onImageLoad(Integer pos, Drawable drawable) {View view = listView.findViewWithTag(pos);if(view != null){ImageView iv = (ImageView) view.findViewById(R.id.sItemIcon);iv.setBackgroundDrawable(drawable);}}});

看到了吧,就是把得到的drawable与加载到UI中!!!!这就实现了回调

OK,就到这吧,OnError()的原理一样,只不过是对程序没有加载到图片时应该怎么处理,其实就是当没有加载到图片时就是默认图片代替。
下面给出源码:http://download.csdn.net/detail/harvic880925/6802241(不要分,仅供分享)

请大家尊重作者板权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/17766027 ,谢谢!

listview中getview异步加载网络图片相关推荐

  1. 浅谈Android中的异步加载之ListView中图片的缓存及优化三

    隔了很久没写博客,现在必须快速脉动回来.今天我还是接着上一个多线程中的异步加载系列中的最后一个使用异步加载实现ListView中的图片缓存及其优化.具体来说这次是一个综合Demo.但是个人觉得里面还算 ...

  2. iOS开发swift版异步加载网络图片(带缓存和缺省图片)

    iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存. 异步加载图片的核心代码如下: ...

  3. ios开发多线程篇--异步加载网络图片GCD

    一.异步加载网络图片 1.ATS (1)简介 从iOS9.0开始,如果按照以前的方式写代码,在访问网络的时候 ,会报以下警告信息: App Transport Security has blocked ...

  4. IOS开发之异步加载网络图片并缓存本地实现瀑布流(一)

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为博主原创文章,未经博主允许不得转载. [objc] view plaincopy </pre>&l ...

  5. android 图片加载 软引用_Android 异步加载网络图片并缓存到本地 软引用 学习分享(转)...

    迪 王. 于 星期四, 20/02/2014 - 21:36 提交 在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片. 软 ...

  6. C#中PictureBox异步加载图片

    C#中PictureBox异步加载图片 ??yy 2017-11-05 23:30:00  443  收藏 版权 void Button1Click(object sender, EventArgs ...

  7. android异步加载图片并缓存到内存和sd卡上,Android批量图片加载经典系列——采用二级缓存、异步加载网络图片...

    http://www.cnblogs.com/jerehedu/p/4560119.html 2015-06-08 09:20 by 杰瑞教育, 232 阅读, 1 评论, 收藏, 编辑一.问题描述 ...

  8. Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

    ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很 ...

  9. 网络相册:Gallery+AsyncTask+URLConnection 实现异步加载网络图片

    这个例子需要点基础知识: Gallery的使用,这个网上的例子多的是 如何使用AsyncTask,这个可以看这里<[Android]异步任务AsyncTask使用解析> 使用URLConn ...

最新文章

  1. 我的网站-广西信息平台_广西虚拟主机
  2. Observer模式在J2EE中的实现
  3. linux查看telnet进程,SuseLinux上配置Telnet服务,重启xinetd守护进程时的异常
  4. linux命令行终端全局反色
  5. php qcloud sdk weapp_微信小程序源码+PHP后台
  6. NIO之ByteBuffer_NIO之网络IO_与ChannelNetty初窥门径
  7. 为ZooKeeper增加一个小功能:指定IP进行受限客户端过滤
  8. android手机通讯录格式转换,手机通讯录csv格式转vcf格式工具 安卓电话本数据格式转换程序...
  9. 树莓派4b主板特点_树莓派4B的入手操作
  10. NIUSHOP wap端底部导航设置
  11. TileMap插件学习
  12. excel如何将内容拆分
  13. 南昌大学计算机导师林振荣,南昌大学各学院研究生导师介绍
  14. Keil关于.axf文件报错
  15. 酷派android最新版本,酷云手机版下载
  16. mini.DataGrid使用说明
  17. 最新悬赏猫任务接单发布系统APP三端源码 附带视频详细搭建教程
  18. 【dubbo】No provider available from registry 127.0.0.1:2181 for service com.dubbo.api.service
  19. 一个好用的脚本生成工具
  20. mcrypt java_使用openssl解密mcrypt

热门文章

  1. codeblocks和vscode编译时弹出不支持的16位程序解决方案
  2. 解决VS在高DPI下设计出的Winform程序界面变形问题
  3. 关于System.AccessViolationException异常
  4. 除了允许变量被const函数修改之外,'mutable'关键字是否有任何其他用途?
  5. Android错误:无法在设备上安装* .apk *:超时
  6. 如何将字节数组转换为十六进制字符串,反之亦然?
  7. Python基础-pyqt5
  8. commons,jsoup,htmlunit,jackson,nekohtml,Object,xalan,xercesImpl,beanutils,lang3,httpclient,jar包下载
  9. 数据挖掘与其商务智能上的应用的实验报告
  10. tensorflow2.0对应python版本_TensorFlow2.1.0最新版本安装详细教程