歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 異步更新imageview 圖片

Android 異步更新imageview 圖片

日期:2017/3/1 10:51:20   编辑:Linux編程
也許有很多人會遇到一個圖片加載不出來的時候, 有這麼一個現象,當你第一次可以加載到圖片,但是到第二次就加載不出來了,這個問題主要原因是圖片讀取問題,我現在把我做的例子分享給大家,希望對大家有幫助...

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. <uses-sdk android:minSdkVersion="8" />
  6. <application
  7. android:icon="@drawable/ic_launcher"
  8. android:label="@string/app_name" >
  9. <activity
  10. android:label="@string/app_name"
  11. android:name=".AsyncImageViewActivity" >
  12. <intent-filter >
  13. <action android:name="android.intent.action.MAIN" />
  14. <category android:name="android.intent.category.LAUNCHER" />
  15. </intent-filter>
  16. </activity>
  17. </application>
  18. <uses-permission android:name="android.permission.INTERNET" />
  19. </manifest>

2,AsyncImageViewActivity類

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

3,對於圖片異步處理類:AsyncImageLoader ,這個類我采用了緩存.提高圖片的訪問效率,其中圖片的讀取方式被我修改了,只要不會出現圖片讀取出錯的情況.

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

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. <uses-sdk android:minSdkVersion="8" />
  7. <application
  8. android:icon="@drawable/ic_launcher"
  9. android:label="@string/app_name" >
  10. <activity
  11. android:label="@string/app_name"
  12. android:name=".AsyncImageViewActivity" >
  13. <intent-filter >
  14. <action android:name="android.intent.action.MAIN" />
  15. <category android:name="android.intent.category.LAUNCHER" />
  16. </intent-filter>
  17. </activity>
  18. </application>
  19. <uses-permission android:name="android.permission.INTERNET" />
  20. </manifest>
Copyright © Linux教程網 All Rights Reserved