教你如何更省流量刷空间,微博---Android之异步加载网络图片

标签: 流量 空间 微博 | 发表时间:2014-03-02 02:12 | 作者:java2liwei
出处:http://www.iteye.com

      朋友你是否有过这样的经历,当你刷空间,刷微博的时候,有的时候那些图片加载要很长时间,有的却直接可以看到无需慢慢等待,尤其是那些你已经刷过的内容,即使你处于断网的状态下也能看到,往往这种客户体验相对而言比较好,但是有的时候我们清理了手机的一些垃圾后,就不一样了,我们还得从新刷出来,下面我就要说说这个原理了。

      这所有的实现都是通过异步加载产生的,原理就是在我们运行软件时,我们需要将一些图片显示出来,那这些图片要从哪里获取呢,我们可以通过以下的方式获取,先看一张流程图:



 

       首先我们先从map缓存中获取图片,map就是我们先前已经下载好的图片的集合,如果没有,我们查找图片文件,看是否有相应的文件,如果没有我们就开辟一个线程下载图片,等图片下载完成后,我们就将图片的url和图片放到map集合中。下一次再次刷新时,我们就直接从文件中读取已经存在的图片。到这里你应该知道如何更省流量得刷空间了吧,但是我们要实现这种功能额。下面我讲解一下核心代码:

       首先我们创建这样一个类LazyImageLoader,类里面有下面的方法

public Bitmap get(String url,ImageLoaderCallback callback)
	{
		
		Bitmap bitmap = null;
		//先看map集合众是否有这个url的图片
		if(imgManger.contains(url))
		{	
			//直接获取
			bitmap = imgManger.getFromCache(url);
			return bitmap;
		}
		
		else
		{
			callbackManager.put(url, callback);
			//开启线程下载
			startDownLoadTread(url);
		}
		//先返回一个默认的图片
		return getDefaultImag(R.drawable.user_head);
	}

 

      首先我们先从map中查看是否有这个url的图片,如果有直接返回,如果没有开启线程下载,同时先返回一个固定的默认图片接下来我们就要看一下ImgManger中关于图片文件获取的主要方法了:

      首先我们新建一个map如下Map<String, SoftReference<Bitmap>>imgCache;至于SoftReference是什么,我就不说了,在这里主要是提高运行速度。

      首先我们先从上面定义的map中查找,代码如下:

public Bitmap getFromMapCache(String url)
	{
		Bitmap bitmap = null;
		
		SoftReference<Bitmap> ref = null;
		
		synchronized (this)
		{
			ref = imgCache.get(url);
		}
		if(null != ref)
		{
			bitmap = ref.get();
			
		}
		return bitmap;
	}

 这里我们要注意防止线程同步的出现加关键词synchronized;

       如果没有,我们再从查找文件,看是否存在,这里我遇到了一个问题,同时我也明白了一件经常看到的事,显然我们要下载的图片的url是如http://www.xxx/xxx.png这样的格式,那我们将下载的文件命名保存呢?如果我们直接以url保存,那最后是读取和保存的,如果我们重命名,那么首先我们要怎样才能确定保存的是独一无二的呢,其次读取时又要按先前对文件命名的规则对URL解析然后再获取图片,这样一来将会影响读取的速度,那解决办法是有的,通过使用加密算法对url直接加密生成一个独一无二的摘要即可,在这里我直接通过Md5进行加密,到这里你应该明白有时候我们看到的文件的名字是23d4c0e84e1e642088d184807e56e324,115d7b4284479089001c7962b2b906b1之类的吧。下面我们继续写代码:

public Bitmap getFromFile(String url)
	{
		
		String fileName = this.getMd5(url);
		
		FileInputStream is=null;
		
		try
		{
			is=context.openFileInput(fileName);
			
			return BitmapFactory.decodeStream(is);
		} 
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
			return null;
		}
		finally
		{
			if(null != is)
			{
				try{is.close();}catch(Exception ex){};
			}
		}

    上面是直接从文件中查找图片,如果此时还没有,那么我们只有开启线程,通过线程来下载我们所需的图片,再将图片写到文件在写文件的时候文件名是也需要通过md5加密的。线程中主要的代码如下:

public Bitmap downloadImg(String urlStr) throws HttpException
	{
		
		try
		{
			URL url = new URL(urlStr);
			HttpURLConnection connection =(HttpURLConnection) url.openConnection();
			
			String fileName=writerToFile(urlStr,connection.getInputStream());
			
			return BitmapFactory.decodeFile(fileName);
			
		} 
		catch (IOException e)
		{
			e.printStackTrace();
		}
		
		return null;
	}

 上面是通过http从网络中获取数据,其中的writerToFile方法如下:

public String  writerToFile(String fileName, InputStream is)
	{
		
		BufferedInputStream bis = null;
		
		BufferedOutputStream bos = null;
		
		try
		{
			bis = new BufferedInputStream(is);
			bos = new BufferedOutputStream(context.openFileOutput(MD5Utils.md5(fileName), Context.MODE_PRIVATE));
			
			byte[] buffer = new byte[1024];
			int length;
			
			while((length = bis.read(buffer)) != -1)
			{
				bos.write(buffer, 0, length);
			}
			
		} catch (Exception e)
		{
			
		}
		finally
		{
			
			try
			{
				if(null != bis)
				{
					bis.close();
				}
				
				if(null != bos)
					{
						bos.flush();
						bos.close();
					
					}
				
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		
		
		return context.getFilesDir() + "/" + MD5Utils.md5(fileName);
		
	}

 主要是快速读写文件的操作,挺简单的,不懂直接百度,最后当我们的文件写好了,再通过回调的方法
将图片显示出来就行了。下面是我写的小项目的测试,效果还是挺好的,


异步加载的源码我放在下面,稍微改一下
可以直接用,直接调用类SimpleImageLoader 中的showImg(ImageView view,String url);方法即可。
 





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [流量 空间 微博] 推荐:

教你如何更省流量刷空间,微博---Android之异步加载网络图片

- - 编程语言 - ITeye博客
      朋友你是否有过这样的经历,当你刷空间,刷微博的时候,有的时候那些图片加载要很长时间,有的却直接可以看到无需慢慢等待,尤其是那些你已经刷过的内容,即使你处于断网的状态下也能看到,往往这种客户体验相对而言比较好,但是有的时候我们清理了手机的一些垃圾后,就不一样了,我们还得从新刷出来,下面我就要说说这个原理了.

HostStage-高速美国100M空间/5G流量免费CP空间

- Rossoneri - iGFW
HostStage提供了1种小规格免费空间包,有100MB空间/5G流量,无限子域名,5个绑定域名,无限数据库和FTP账户. 服务器更是强大,和Nextevo免费空间一样,16核的服务器+12G的内存,官方保证服务器99%在线率,但实际从探针可见,截至老哥写这篇文章时,已经50天100%在线了. 注册地址:http://www.host-stage.net/whmcs/cart.php?a=add&pid=15.

happyhost.vn-来自越南的100M空间/5G流量的CP空间

- 富贵 - iGFW
官方介绍:100 MB磁盘空间. 免费JOOMLA,phpBB的,SMF,WordPress的安装. *注册地址:http://www.happyhost.vn/register.php. *演示空间:http://xin123.hostsieucap.com/. *PHP探针:http://xin123.hostsieucap.com/laoge.php.

全球社交媒体排行榜:QQ空间第四 新浪微博第五

- - 行业资讯
   BV4社交媒体排行榜.   3月7日消息,据国际著名第三方认证机构法国国际检验局(BV4)发布的品牌报告显示,Facebook以291亿美元的品牌价值成全球最有影响力的社交媒体品牌,腾讯Qzone排名第四.   在发布的30家社交媒体品牌里,中国品牌占8席,腾讯Qzone以112亿美元的品牌市值列总榜单第四,新浪微博第五(品牌价值39.94亿美元),腾讯微博第八(品牌价值35.26亿美元),人人网第12(品牌价值26.16亿美元),腾讯朋友第14(品牌价值21.93亿美元),开心网第18(品牌价值18.91亿美元),土豆网第21(品牌价值15.43亿美元),优酷第24(品牌价值13.94亿美元).

百万流量的起处:网站从微博中获得用户的细节与方法论

- - 徐志斌
微博现在已经成为继搜索引擎之后又一个流量分发中心,但一家网站究竟能从微博中带走多少流量. 第一个答案是由一家社会化电商网站告诉我们的,他们每天从腾讯微博带走40万独立IP. 而管理后台则显示,从最高每天220万独立IP到最低十几个点击,网站们都出现在那条起伏的曲线中. 于是问题又变成了:那些在尖峰中的网站,他们怎么做到从微博带走可观的流量的.

黑白空间

- 电饭锅 - 设计|生活|发现新鲜
设计师Oki Sato带给我们的黑白空间设计,强烈的素描感. 让你置身平面又似立体空间之中,单看图片眼球就有较强的视觉冲击感,想必如果身处其中的话,一定会迷失. 「设计,生活,发现新鲜」在新浪微博,更即时地获读更新,更直接地交流沟通. © 设计|生活|发现新鲜 | 原文链接 | 投稿 ! | 新浪微博 | 逛逛我们的在线商店.

微博

- qianlaohu - 独立思考
无论名人在微博上讲什么,都能引起很大的“互动”. 王力宏说:“2011年过去一半了,7月了. 感觉就是这几百万人一起围在那里,紧张专注地看着,名人的微博一更新,至少挤在前排的几万人就激动拥抱:“动了. 说微博的迅速崛起会影响媒体,影响门户网站,影响SNS,其实都不对. 它首先威胁到蜡像馆,因为你在蜡像馆只能掏钱看不会动的,而在微博,不用掏钱都能看到会动的.

时间与空间

- 马都 - 博客李淼
(《Vision》文章,勿转). 时间与空间这两个概念是物理学的基石,也是我们人类甚至动物依靠直觉就具备的概念. 我们判断一个物体的位置,我们从一个地点走到另一个地点,涉及到空间这个概念. 在小学,我们就开始学习一些简单的几何概念,例如三角形,三角形中的三个角有锐角、钝角和直角. 到了中学,我们还学一点立体几何和解析几何.

Oracle表空间(tablespaces)

- - 博客园_首页
  我们知道oarcle数据库真正存放数据的是数据文件(data files),Oarcle表空间(tablespaces)实际上是一个逻辑的概念,他在物理上是并不存在的,那么把一组data files 捻在一起就成为一个表空间. 一个数据库可以包含多个表空间,一个表空间只能属于一个数据库. 一个表空间包含多个数据文件,一个数据文件只能属于一个表空间.

表空间传输

- - 数据库 - ITeye博客
Oracle 的可传输表空间特性通过将 元数据和数据文件 简单地从一个数据库移动到另一个数据库,提供 在数据库之间有效移动大数据的一种简易方法. 代替重新创建对象,可移植表空间可以让 毫不费力地移动大对象,而所花费的时间是你手动创建这些对象的时间. 可移植表空间包括将属于源数据库的所有数据文件拷贝到目标数据库,并将关于表空间 数据目录信息从源数据库拷贝到目标数据库.