Android 异步更新imageview 图片


也许有很多人会遇到一个图片加载不出来的时候, 有这么一个现象,当你第一次可以加载到图片,但是到第二次就加载不出来了,这个问题主要原因是图片读取问题,我现在把我做的例子分享给大家,希望对大家有帮助...

main.xml布局文件文件

  1. <manifest xmlns:Android="http://schemas.android.com/apk/res/android"  
  2.     package="com.cn"  
  3.     android:versionCode="1"  
  4.     android:versionName="1.0" >  
  5.   
  6.     <uses-sdk android:minSdkVersion="8" />  
  7.   
  8.     <application  
  9.         android:icon="@drawable/ic_launcher"  
  10.         android:label="@string/app_name" >  
  11.         <activity  
  12.             android:label="@string/app_name"  
  13.             android:name=".AsyncImageViewActivity" >  
  14.             <intent-filter >  
  15.                 <action android:name="android.intent.action.MAIN" />  
  16.   
  17.                 <category android:name="android.intent.category.LAUNCHER" />  
  18.             </intent-filter>  
  19.         </activity>  
  20.     </application>  
  21.     <uses-permission android:name="android.permission.INTERNET" />  
  22. </manifest>  

2,AsyncImageViewActivity类

  1. package com.cn;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.ImageView;  
  6.   
  7. public class AsyncImageViewActivity extends Activity {  
  8.     private ImageView user_image;  //用户头像   
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.         user_image = (ImageView)findViewById(R.id.user_image);  
  14.         String image_url = "http://fs.yy365.com/d3/photos/2010/05/20/09/pic_1274317680739_a637337f-0769-4cb3-ad07-bb2b1ba38c4a_1.jpg";  
  15.         //异步加载头像   
  16.         AsyncImageLoader.setImageViewFromUrl(image_url, user_image);  
  17.     }  
  18. }  

3,对于图片异步处理类:AsyncImageLoader ,这个类我采用了缓存.提高图片的访问效率,其中图片的读取方式被我修改了,只要不会出现图片读取出错的情况.

  1. package com.cn;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.ByteArrayInputStream;  
  5. import java.io.ByteArrayOutputStream;  
  6. import java.io.InputStream;  
  7. import java.lang.ref.SoftReference;  
  8. import java.net.URL;  
  9. import java.util.HashMap;  
  10.   
  11. import android.graphics.drawable.Drawable;  
  12. import android.os.Handler;  
  13. import android.os.Message;  
  14. import android.util.Log;  
  15. import android.widget.ImageView;  
  16.   
  17. /** 
  18.  * 对于图片异步处理类 
  19.  * @author liuxr 
  20.  * 
  21.  */  
  22. public class AsyncImageLoader {  
  23.   
  24.      static ImageView singImageView; //针对于单张图片异步加载   
  25.      private static HashMap<String, SoftReference<Drawable>> singleImageCache = null;  
  26.              
  27.         /** 
  28.          * 通过图片地址,返回drawable 
  29.          * @param url 
  30.          * @return 
  31.          */  
  32.         public static Drawable loadImageFromUrl(String url) {  
  33.             ByteArrayOutputStream out = null;  
  34.             Drawable drawable = null;  
  35.             int BUFFER_SIZE = 1024*16;  
  36.             InputStream inputStream = null;  
  37.             try{  
  38.                 inputStream = new URL(url).openStream();  
  39.                 BufferedInputStream in = new BufferedInputStream(inputStream, BUFFER_SIZE);  
  40.                 out = new ByteArrayOutputStream(BUFFER_SIZE);  
  41.                 int length = 0;  
  42.                 byte[] tem = new byte[BUFFER_SIZE];  
  43.                 length = in.read(tem);  
  44.                 while(length != -1){  
  45.                     out.write(tem, 0, length);  
  46.                     length = in.read(tem);  
  47.                 }  
  48.                 in.close();  
  49.                 drawable = Drawable.createFromStream(new ByteArrayInputStream(out.toByteArray()), "src");  
  50.             }catch(Exception e){  
  51.                 e.printStackTrace();  
  52.             }finally{  
  53.                 if(inputStream != null){  
  54.                     try{  
  55.                         inputStream.close();  
  56.                     }catch(Exception e){}  
  57.                 }  
  58.             }  
  59.             return drawable;  
  60.         }  
  61.          /** 
  62.           * 异步设置单张imageview图片,采取软引用 
  63.          * @param url 网络图片地址 
  64.          * @param imageView 需要设置的imageview 
  65.          */  
  66.         public static void setImageViewFromUrl(final String url, final ImageView imageView){  
  67.             singImageView = imageView;  
  68.             //如果软引用为空,就新建一个   
  69.             if(singleImageCache == null){  
  70.                 singleImageCache = new HashMap<String, SoftReference<Drawable>>();  
  71.             }  
  72.             //如果软引用中已经有了相同的地址,就从软引用中获取   
  73.             if(singleImageCache.containsKey(url)){  
  74.                 SoftReference<Drawable> soft = singleImageCache.get(url);  
  75.                 Drawable draw = soft.get();  
  76.                 singImageView.setImageDrawable(draw);  
  77.                 return;  
  78.             }  
  79.             final Handler handler = new Handler(){  
  80.                 @Override  
  81.                 public void handleMessage(Message msg) {  
  82.                     singImageView.setImageDrawable((Drawable)msg.obj);  
  83.                 }  
  84.             };  
  85.             //子线程不能更新UI,又不然会报错   
  86.              new Thread(){  
  87.                  public void run() {  
  88.                      Drawable drawable = loadImageFromUrl(url);  
  89.                      if(drawable == null){  
  90.                          Log.e("single imageview""single imageview of drawable is null");  
  91.                      }else{  
  92.                          //把已经读取到的图片放入软引用   
  93.                          singleImageCache.put(url, new SoftReference<Drawable>(drawable));  
  94.                      }  
  95.                      Message message = handler.obtainMessage(0, drawable);  
  96.                      handler.sendMessage(message);  
  97.                  };  
  98.              }.start();  
  99.          }  
  100. }  

4,AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.cn"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="8" />  
  8.   
  9.     <application  
  10.         android:icon="@drawable/ic_launcher"  
  11.         android:label="@string/app_name" >  
  12.         <activity  
  13.             android:label="@string/app_name"  
  14.             android:name=".AsyncImageViewActivity" >  
  15.             <intent-filter >  
  16.                 <action android:name="android.intent.action.MAIN" />  
  17.   
  18.                 <category android:name="android.intent.category.LAUNCHER" />  
  19.             </intent-filter>  
  20.         </activity>  
  21.     </application>  
  22.     <uses-permission android:name="android.permission.INTERNET" />  
  23. </manifest>  

相关内容