Android新浪微博client(七)——ListView图片异步加载、高速缓存

原文出自:方杰|

p=193" style="color:rgb(202,0,0); text-decoration:none; font-size:14px; font-family:Georgia,‘Times New Roman‘,‘Bitstream Charter‘,Times,serif; line-height:21px">http://fangjie.sinaapp.com/?p=193转载请注明出处

终于效果演示:

page_id=54" href="http://fangjie.sinaapp.com/?

page_id=54">http://fangjie.sinaapp.com/?page_id=54

该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo

一.ListView的图片异步载入

我们都知道对每个Weibo Item都实用户头像,并且每一条微博还可能带有图片。假设在载入列表的同一时候载入图片。这样有几个缺点,第一非常费事,界面卡住,用户体验非常不好,第二Android在主线程中不能有网络操作,所以本身实现起来就非常麻烦。所以我们才实现一个图片异步载入类。继承自AsyncTask<String, Void, Bitmap>,重载当中的方法。

doInBackground才是真正的异步操作。做一些耗时的任务,这里就是去server上下载图片,onPostExecute是在doInBackground结束后调用的。并传入doInBackground的返回值。

    public AsyncImageLoader(ImageView image, LruCache<String, Bitmap> lruCache,int width,int height) {
        super();
        this.image = image;
        this.lruCache = lruCache;
        this.width=width;
        this.height=width;
    }  

    @Override
    protected Bitmap doInBackground(String... params) {
        Bitmap bitmap = null;
        bitmap = GetUserInfo.getBitmap(params[0]);
        if(width!=0&height!=0)
        	bitmap=GetUserInfo.scaleImg(bitmap, width, height);
        addBitmapToMemoryCache(params[0], bitmap);
        return bitmap;
    }  

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        image.setImageBitmap(bitmap);
    }

然后在WeiboAdapter中封装一个接口 loadBitmap,载入图片。

二.ListView图片缓存

ListView常常会上下滑动,而这些图片载入任务就会重复调用。这样就非常浪费。能够为图片实现缓存,当某个图片载入过之后须要再次显示仅仅须要从内存中拿出来显示就能够。不须要再去载入。缓存事实上有两种缓存。一种是内存缓存。还有一种是SD卡缓存,即下载图片到SD卡中。这里我们仅仅讲内存缓存。

结合上面的图片异步载入,整个图片显示的过程是这样:当须要显示图片的时候,先去内存中查找看是否有这样的图片的缓存。有的话就直接显示,没有的话,去异步载入,然后保存到内存缓存中。然后显示。

完整的AsyncImageLoader.java代码

package com.fangjie.weibo.util;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.support.v4.util.LruCache;
import android.widget.ImageView;

public class AsyncImageLoader extends AsyncTask<String, Void, Bitmap> {

	private ImageView image;
    private LruCache<String, Bitmap> lruCache;
    private int width;
    private int height;
    /**
     * 构造方法。须要把ImageView控件和LruCache 对象传进来
     * @param image 载入图片到此 {@code}ImageView
     * @param lruCache 缓存图片的对象
     */
    public AsyncImageLoader(ImageView image, LruCache<String, Bitmap> lruCache,int width,int height) {
        super();
        this.image = image;
        this.lruCache = lruCache;
        this.width=width;
        this.height=width;
    }  

    @Override
    protected Bitmap doInBackground(String... params) {
        Bitmap bitmap = null;
        bitmap = GetUserInfo.getBitmap(params[0]);
        if(width!=0&height!=0)
        	bitmap=GetUserInfo.scaleImg(bitmap, width, height);
        addBitmapToMemoryCache(params[0], bitmap);
        return bitmap;
    }  

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        image.setImageBitmap(bitmap);
    }
        //调用LruCache的put 方法将图片增加内存缓存中。要给这个图片一个key 方便下次从缓存中取出来
    private void addBitmapToMemoryCache(String key, Bitmap bitmap) {
        if (getBitmapFromMemoryCache(key) == null) {
            lruCache.put(key, bitmap);
        }
    }
        //调用Lrucache的get 方法从内存缓存中去图片
    public Bitmap getBitmapFromMemoryCache(String key) {
        return lruCache.get(key);
    }
}

在WeiboAdapter中的调用接口,loadBitmap

	private final int maxMemory = (int) Runtime.getRuntime().maxMemory();//获取当前应用程序所分配的最大内存
    private final int cacheSize = maxMemory / 5;//仅仅分5分之中的一个用来做图片缓存
    private LruCache<String, Bitmap> mLruCache = new LruCache<String, Bitmap>(
            cacheSize) {
    	protected int sizeOf(String key, Bitmap bitmap) {//复写sizeof()方法
            // replaced by getByteCount() in API 12
            return bitmap.getRowBytes() * bitmap.getHeight() / 1024; //这里是按多少KB来算
        }
    }; 

	/**
	 *
	 * @param urlStr 所须要载入的图片的url。以String形式传进来,能够把这个url作为缓存图片的key
	 * @param image ImageView 控件
	 */
	private void loadBitmap(String urlStr, ImageView image,int width,int height) {
		System.out.println(urlStr);
		AsyncImageLoader asyncLoader = new AsyncImageLoader(image, mLruCache,width,height);//什么一个异步图片载入对象
		Bitmap bitmap = asyncLoader.getBitmapFromMemoryCache(urlStr);//首先从内存缓存中获取图片
		if (bitmap != null) {
			image.setImageBitmap(bitmap);//假设缓存中存在这张图片则直接设置给ImageView
		} else {
			image.setImageResource(R.drawable.user_head);//否则先设置成默认的图片
			asyncLoader.execute(urlStr);//然后运行异步任务AsycnTask 去网上载入图片
		}
	}

至此,微博主页的微博列表载入也就所有完毕。

还有非常多细小的点都没讲到,可是都有源代码,相信大家都能看得懂的。整个project文件截图:

代码放在:http://git.oschina.net/fangjie/Sina-Weibo  效果展示:

page_id=54">http://fangjie.sinaapp.com/?page_id=54

:因为新浪微博的开发平台申请的应用没有通过审核,所以不是全部的微博帐号都能够授权成功,须要測试的话能够找我,也能够在源代码中(com.fangjie.weibo.util.AuthUtil)改成你申请的appkey,appsecret。

微博client项目有时间再往下写吧!

欢迎各位关注我的个人网站:http://fangjie.sinaapp.com/

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-11-05 23:27:45

Android新浪微博client(七)——ListView图片异步加载、高速缓存的相关文章

Android ListView 图片异步加载和图片内存缓存

开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用户省流量,一般把加载完的图片先缓存下来,下次加载的时候就不需要再联网去服务器端加载.图片缓存一般分为一级缓存(即内存缓存)和二级缓存(即磁盘缓存).这里只讲一级缓存. 内存缓存就是把加载完的图片先放在手机内存中,等下次加载的时候再从内存中取出来. 优点是速度快,缺点是不能长久保存,用户退出应用程序之

Android新浪微博客户端(七)——ListView中的图片异步加载、缓存

原文出自:方杰|http://fangjie.sinaapp.com/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo 一.ListView的图片异步加载 我们都知道对每一个Weibo Item都有用户头像,而且每一条微博还可能带有图片.如果在加载列表的同时加载图片,这样有几个缺点,第一很费事,界面卡住,用户体验很不

Android编程之图片(异步)加载类

应某人之请,写一篇关于图片加载类.其实,网上有很多这样的类,而且比较推崇的是来自google中开源中的一篇.他写的比较好了,而且注意了内存优化,下面贴出它的图片下载类: [java] view plaincopy /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not 

Android图片异步加载之Android-Universal-Image-Loader

将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就顺便整理记录下来,作为这一个多月来博客的重新开火做饭吧.从今天起我会陆续恢复博客的更新,也希望大家继续支持. 今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异

简单的ListView中item图片异步加载

前言: 在android开发当中,从目标地址获取图片往往都是采用异步加载的方法.当完全加载完图片后在进行显示,也有些是直接将加载的图片一点一点的显示出来. 这两个区别只是对流的处理不同而已.现在就讲讲当图片被完全获取到后在显示的方法. 一,效果图:       初始化:                                                   获取后:                         1.1,效果思路: 初始化的时候默认ImageView显示一张白色的图

Android图片异步加载之Android-Universal-Image-Loader(转)

今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异步加载解决方案.做Android的同学都知道,Android加载大量图片时,由于系统分配给图片加载的内存大小有限,所以,如果加载图片量非常大的话容易报OOM异常,关于这个异常已经有不少解决方案了,我就不赘述.下面就简要介绍下这个开源项目的主要功能和使用: 一.功能概要 多线程图片加载: 灵活更改ImageLo

Android图片异步加载

原:http://www.cnblogs.com/angeldevil/archive/2012/09/16/2687174.html 相关:https://github.com/nostra13/Android-Universal-Image-Loader 开发Android程序,一般情况下都会有两个操作,图片的异步加载与缓存,而图片的异步加载大都是从网络读取图片(还有生成本地图片缩略图等操作),为了减少网络操作,加快图片加载速度就需要对图片进行缓存,所以网上的好多图片异步加载方法都是与图片的

Android图片异步加载框架Android-Universal-Image-Loader

Android-Universal-Image-Loader是一个图片异步加载,缓存和显示的框架.这个框架已经被很多开发者所使用,是最常用的几个Android开源项目之一,主流的应用,随便反编译几个,都可以见到它的身影.淘宝,天猫,Facebook,京东商城等都用到了这个项目. 该项目的Github地址链接:https://github.com/nostra13/Android-Universal-Image-Loader 运行流程: 每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片

Android图片异步加载之Android-Universal-Image-Loader类库的使用

Android开发中我们会经常遇到图片过多或操作不当造成Out of Memory异常,有时虽然是解决了这个问题但却会影响程序的运行效率,例如:当用户在快速滑动滚动条的过程中,我们程序在仍在艰难的加载服务器端的图片,这样给用户造成了极不好的体验.其实网络上关于图片的异步加载和缓存的讲解很多,但是其实,写一个这方面的程序还是比较麻烦的,要考虑多线程,缓存,内存溢出等很多方面,针对这一广大开发者都会遇到的问题,一些牛人们已经帮我们解决了这一问题,今天我为大家介绍一款很流行的开源类库,可以很很好的解决