歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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>  
Copyright © Linux教程網 All Rights Reserved