老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Android實現異步加載圖片

麥洛開通博客以來,有一段時間沒有更新博文了.主要是麥洛這段時間因項目開發實在太忙了.今天周六還在公司加班,苦逼程序猿都是這樣生活的.

在呼蘭等地區,都構建了全面的區域性戰略布局,加強發展的系統性、市場前瞻性、產品創新能力,以專注、極致的服務理念,為客戶提供成都網站設計、網站建設、外貿網站建設 網站設計制作按需開發,公司網站建設,企業網站建設,成都品牌網站建設,成都全網營銷推廣,外貿網站制作,呼蘭網站建設費用合理。

今天在做項目的時候,有一個實現異步加載圖片的功能,雖然比較簡單但還是記錄一下吧.因為麥洛之前實現異步加載圖片都是使用了AsynTask這個API,繼續這個類,實現起來非常簡單也很方便.在doInBackground()方法里實現下載邏輯.具體實現如下

實現邏輯是:先從內存中讀取,如果內存中有這張圖片,則直接使用;如果內存沒有再到sdcard上讀取,如果有則顯示;如果sdcard上還沒有則到網絡上讀取.內存中開啟緩存是參考了網上的實現.麥洛在這里非常感謝喜歡分享的程序猿們.

public class ImageDownloader extends AsyncTask {

  private static final String TAG = "ImageDownloader";
  // 為了加快速度,在內存中開啟緩存(主要應用于重復圖片較多時,或者同一個圖片要多次被訪問,比如在ListView時來回滾動)
  private Map> imageCache = new HashMap>();
  /**
   * 顯示圖片的控件
   */
  private ImageView mImageView;

  public ImageDownloader(ImageView image) {
    mImageView = image;
  }

  @Override
  protected void onPreExecute() {
    super.onPreExecute();
  }

  @Override
  protected Object doInBackground(String... params) {
    // Log.i("ImageDownloader", "loading image...");
    String url = params[0];
    Drawable drawable = null;
    try {
      if (!"".equals(url) && url != null) {
        String fileName = url.hashCode()+".jpg";
        // 如果緩存過就從緩存中取出數據
        if (imageCache.containsKey(fileName)) {
          SoftReference softReference = imageCache.get(fileName);
          drawable = softReference.get();
          if (drawable != null) {
            return drawable;
          }
        }
        File dir = new File(FileConstant.IMAGE_FILE_PATH);
        if (!dir.exists()) {
          boolean m = dir.mkdirs();
        }
        File file = new File(dir, fileName);
        if (file.exists() && file.length() > 0) {
          Log.i(TAG, "load image from sd card");
          // 如果文件存在則直接讀取sdcard
          drawable = readFromSdcard(file);
        } else {
          //file.createNewFile();
          Log.i(TAG, "load image from network");
          URL imageUrl = new URL(url);
          // 寫入sdcard
          if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            saveImageFile(imageUrl, file);
            drawable = Drawable.createFromStream(new FileInputStream(file), fileName);
          }else{
            //直接從流讀取
            drawable = Drawable.createFromStream(imageUrl.openStream(), fileName);
          }
        }
        if(drawable!=null){
          //保存在緩存中
          imageCache.put(fileName, new SoftReference(drawable));
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    } 
    return drawable;
  }
  /**
   * save image
*/
  private void saveImageFile(URL url, File file) {
    FileOutputStream out = null;
    InputStream in = null;
    try {
      file.deleteOnExit();
      out = new FileOutputStream(file);
      in = url.openStream();
      byte[] buf = new byte[1024];
      int len = -1;
      while((len = in.read(buf))!=-1){
        out.write(buf, 0, len);
        out.flush();
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if(out!=null){
        try {
          out.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      if(in!=null){
        try {
          in.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }

  /**
   * 從sdcard中獲取圖片
*/
  private Drawable readFromSdcard(File file) throws Exception {
    FileInputStream in = new FileInputStream(file);
    return Drawable.createFromStream(in, file.getName());
  }

  @Override
  protected void onPostExecute(Object result) {
    super.onPostExecute(result);
    Drawable drawable = (Drawable) result;
    if (mImageView != null && drawable != null) {
      mImageView.setBackgroundDrawable(drawable);
    }
  }

  @Override
  protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
  }

  @Override
  protected void onCancelled() {
    super.onCancelled();
  }

}

使用時:

ImageDownloader loader = new ImageDownloader(imageView);
loader.execute(url);

其實這樣的話,還有一些隱患的,就是說這個類實現還是有些問題的.比如每次都在imageView中設置網絡上的圖片時,其實是沒有使用到這個類里面的內存緩存的,就是imageCache

Map> imageCache = new HashMap>();
因為每次設置imageView的時候,都是new了一個ImageDownloader的對象.所以每個ImageDownloader對象里面都是獨立的一個imageCache.

另外,AsynTask也是一個線程.而每次使用都開一個線程來load 圖片,對線程個數沒有進行顯示,畢竟線程數目還是有限制的.
所以麥洛今天發現了這個問題,于是參考了別人的實現,使用了線程池,實現邏輯也上面的代碼一樣,先從內存讀取,如果沒有到sdcard讀取,如果還是沒有,則是網絡讀取;實現沒有使用AsynTask,具體代碼如下:

/**
 * 異步加載圖片,并將圖片設置到ImageView控件中
*/
public class ImageDownloader extends AsyncTask {

  private static final String TAG = "ImageDownloader";
  // 為了加快速度,在內存中開啟緩存(主要應用于重復圖片較多時,或者同一個圖片要多次被訪問,比如在ListView時來回滾動)
  private Map> imageCache = new HashMap>();
  /**
   * 顯示圖片的控件
   */
  private ImageView mImageView;

  public ImageDownloader(ImageView image) {
    mImageView = image;
  }

  @Override
  protected void onPreExecute() {
    super.onPreExecute();
  }

  @Override
  protected Object doInBackground(String... params) {
    // Log.i("ImageDownloader", "loading image...");
    String url = params[0];
    Drawable drawable = null;
    try {
      if (!"".equals(url) && url != null) {
        String fileName = url.hashCode()+".jpg";
        // 如果緩存過就從緩存中取出數據
        if (imageCache.containsKey(fileName)) {
          SoftReference softReference = imageCache.get(fileName);
          drawable = softReference.get();
          if (drawable != null) {
            return drawable;
          }
        }
        File dir = new File(FileConstant.IMAGE_FILE_PATH);
        if (!dir.exists()) {
          boolean m = dir.mkdirs();
        }
        File file = new File(dir, fileName);
        if (file.exists() && file.length() > 0) {
          Log.i(TAG, "load image from sd card");
          // 如果文件存在則直接讀取sdcard
          drawable = readFromSdcard(file);
        } else {
          //file.createNewFile();
          Log.i(TAG, "load image from network");
          URL imageUrl = new URL(url);
          // 寫入sdcard
          if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            saveImageFile(imageUrl, file);
            drawable = Drawable.createFromStream(new FileInputStream(file), fileName);
          }else{
            //直接從流讀取
            drawable = Drawable.createFromStream(imageUrl.openStream(), fileName);
          }
        }
        if(drawable!=null){
          //保存在緩存中
          imageCache.put(fileName, new SoftReference(drawable));
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    } 
    return drawable;
  }
  /**
   * save image
*/
  private void saveImageFile(URL url, File file) {
    FileOutputStream out = null;
    InputStream in = null;
    try {
      file.deleteOnExit();
      out = new FileOutputStream(file);
      in = url.openStream();
      byte[] buf = new byte[1024];
      int len = -1;
      while((len = in.read(buf))!=-1){
        out.write(buf, 0, len);
        out.flush();
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if(out!=null){
        try {
          out.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      if(in!=null){
        try {
          in.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }

  /**
   * 從sdcard中獲取圖片
 */
  private Drawable readFromSdcard(File file) throws Exception {
    FileInputStream in = new FileInputStream(file);
    return Drawable.createFromStream(in, file.getName());
  }

  @Override
  protected void onPostExecute(Object result) {
    super.onPostExecute(result);
    Drawable drawable = (Drawable) result;
    if (mImageView != null && drawable != null) {
      mImageView.setBackgroundDrawable(drawable);
    }
  }

  @Override
  protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
  }

  @Override
  protected void onCancelled() {
    super.onCancelled();
  }

}

這個ImageDownloader2的使用也很簡單

public class ImageUtil {
  /**
   * image loader
   */
  static ImageDownloader2 loader = null;
  
  /**
   * load image
*/
  public static void loadImage(String url,final ImageView imageView){
    if(loader == null){
      loader = new ImageDownloader2();
    }
    loader.loadDrawable(url, new ImageCallback() {
      
      @Override
      public void imageLoaded(Drawable imageDrawable) {
        if(imageDrawable!=null){
          imageView.setBackgroundDrawable(imageDrawable);
        }
      }
    });
  }
  
}

每次在使用是需要調用ImageUtil.loadImage(url,imageView)將圖片url已經需要顯示圖片的控件ImageView的引用傳入就可以了.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創新互聯。


網站題目:Android實現異步加載圖片
URL網址:http://www.xueling.net.cn/article/psphcp.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 日本婷婷| 欧美VA亚洲VA在线观看日本 | 国产精品香蕉在线的人 | 久久精品国产亚洲沈樵 | 黄色快播网站 | 天天操好逼 | 欧美成人免费观看视频 | 亚洲不卡视频在线观看 | caoporen个人免费公开 | 欧美国产精品久久 | 东北老夫妇啪啪嗷嗷叫 | 国产成人一区二区三区在线播放 | 精品乱码久久久 | 中国一级黄色影片 | 娇妻在厨房被朋友玩得呻吟 | 领导在办公室含我奶头小短文 | 无码人妻丰满熟妇区毛片18 | 出租屋嫖妓大龄熟妇露脸在线播放 | 日韩精品一区二区大桥未久 | 日韩免费| 柠檬av导航| 精品国产一区二区三区麻豆 | 992tv成人国产福利在线 | 色综合久久婷婷88 | 亚州av片 | 国产乱仑视频 | 欧美高大丰满freesex | ww久久中文字幕 | 98久久| 2020国产精品香蕉在线观看 | 久草资源视频 | KTV少少爷互囗交Gaygv | 亚洲国产天堂久久综合网 | 久久99网 | 成人黄色一区 | 亚洲欧美日韩丝袜另类 | 国产成人手机在线 | 一区二区三区在线 | 秒播福利视频 | 精品亚洲AⅤ无码午夜在线网站 | 免费看片免费播放国产 |