`

网络获取图片的方法的重写--较简洁(如果手机缓存里面有就从缓存获取)

阅读更多
   我前面的博客写了网络获取图片的方法(见:《Android中获取网络图片的方法(如果手机缓存里面有就从缓存获取)》),但比较原始,代码比较冗长,想简化一下。另外一篇文章:《Android中获取网络图片的三种方法》里面的公用获取Drawable对象的方法,是不会缓存到手机里面的,这里就把那个方法(loadImageFromNetwork() )重写一下,达到图片缓存的目的:

// 如果缓存里面有就从缓存获取,否则网络获取图片,返回Drawable对象
	public static Drawable loadImageFromNetwork(Context context, String imageUrl)
	{
		Drawable drawable = null;
		if(imageUrl == null )
			return null;
		String imagePath = "";
		String   fileName   = "";
			
		// 获取url中图片的文件名与后缀
		if(imageUrl!=null&&imageUrl.length()!=0){ 
            fileName  = imageUrl.substring(imageUrl.lastIndexOf("/")+1);
		}
		
		// 图片在手机本地的存放路径,注意:fileName为空的情况
		imagePath = context.getCacheDir() + "/" + fileName;

		Log.i("test","imagePath = " + imagePath);
		File file = new File(context.getCacheDir(),fileName);// 保存文件
		Log.i("test","file.toString()=" + file.toString());
		if(!file.exists()&&!file.isDirectory())
		{
			try {
				// 可以在这里通过文件名来判断,是否本地有此图片
				
				FileOutputStream   fos=new   FileOutputStream( file );
				InputStream is = new URL(imageUrl).openStream();
				int   data = is.read(); 
				while(data!=-1){ 
				        fos.write(data); 
				        data=is.read();; 
				} 
				fos.close();
				is.close();
//				drawable = Drawable.createFromStream(
//						new URL(imageUrl).openStream(), file.toString() ); // (InputStream) new URL(imageUrl).getContent();
				drawable = Drawable.createFromPath(file.toString());
				Log.i("test", "file.exists()不文件存在,网上下载:" + drawable.toString());
			} catch (IOException e) {
				Log.d("test", e.getMessage());
			}
		}else
		{
			drawable = Drawable.createFromPath(file.toString());
			Log.i("test", "file.exists()文件存在,本地获取");
		}
		
		if (drawable == null) {
			Log.d("test", "null drawable");
		} else {
			Log.d("test", "not null drawable");
		}
		
		return drawable ;
	}
2
1
分享到:
评论

相关推荐

    ViewPager图片滑动(网络图片加载 + 内部缓存) 移动互联实例

    默认情况下,当图片从网络加载后,Glide会将其存储在内部缓存中,以便下次再次请求同一图片时能快速从缓存中获取,无需重新下载,从而提升应用性能。 内部缓存机制是通过LruCache(最近最少使用)来管理内存缓存,...

    图片缓存框架使用

    在Android应用开发中,图片加载和缓存是一个关键部分,特别是在处理大量图片或者网络图片时。本主题将详细探讨如何利用开源的图片缓存框架来优化这一过程,以提高用户体验和应用性能。我们将重点关注以下几个方面: ...

    安卓Android源码——listview获取网络图片缓存优化.zip

    本压缩包“安卓Android源码——listview获取网络图片缓存优化.zip”提供了一个针对这个问题的解决方案,旨在通过优化代码来提升用户体验。 首先,我们要理解ListView的工作原理。ListView采用了一种叫做"视图复用...

    Android自定义ListView图片从服务端获取

    总之,Android自定义ListView从服务端获取图片涉及网络请求、图片加载库、缓存策略、ListView优化等多个环节,需要综合考虑性能和用户体验。通过熟练掌握这些技术,我们可以创建出高效、流畅的ListView应用。

    Android高德加载谷歌卫星瓦片,并缓存本地

    - 实现`TileProvider`接口,重写`getTile`方法,动态构造谷歌卫星图瓦片的URL,并使用HTTP请求获取图片数据。 - 将返回的Bitmap对象添加到TileOverlay,显示在地图上。 3. **缓存谷歌卫星瓦片**: - 为了提高...

    afinal(封装了数据库,注解,网络,图片缓存的框架)

    例如,当需要从网络获取用户信息并显示在界面上时,可以先发起网络请求,然后将返回的JSON数据解析成对应的User对象,最后利用`@InjectView`注解绑定的TextView显示用户信息。同时,如果用户信息包含头像URL,`...

    Android异步加载图像小结 (含线程池,缓存方法).zip

    内存缓存可以在短时间内快速获取图片,而磁盘缓存则用于存储大量图片,即使应用关闭后仍能读取。`LruCache`是Android提供的一个基于最近最少使用原则的内存缓存实现,而`DiskLruCache`则用于磁盘缓存。 4. **图片库...

    【Gopher China 2015】龚浩华(月牙寂)p2p缓存系统

    - **Web缓存与P2P缓存的区别**:传统的Web缓存类似于CDN技术,主要用于网页、图片、普通下载以及视频等内容的加速;而P2P缓存则更侧重于下载(例如BT下载)和视频播放(如QVOD、百度影音等),通过用户间互相分享...

    网络下载图片demo

    - 创建一个Thread对象,重写`run()`方法来实现网络下载逻辑。使用Handler或Runnable配合Looper可以在完成下载后与主线程通信,更新UI。 5. **图片解码与缓存**: - 下载的图片数据通常是字节数组,需要解码为...

    volley框架

    - 使用Volley创建网络请求非常简单,只需继承`Request`类并重写相应的方法,例如`getParams()`用于设置POST请求的数据,`parseNetworkResponse()`用于解析网络响应。 - `JsonObjectRequest`和`JsonArrayRequest`等...

    Android-Matisse设计精良的Android本地图片选择器

    Matisse作为一款优秀的Android本地图片选择器,其简洁的设计、强大的功能和良好的可定制性,使得它成为开发者实现图片选择功能的首选。无论是在小规模项目还是大型应用中,都能看到Matisse的身影,为提升用户体验和...

    viewpager网络图片循环广告banner

    在这个方法中,我们可以根据当前选中的页面位置进行调整,如果已经到达列表末尾,就重新从头开始,反之亦然,从而实现无限循环的效果。 此外,为了让广告自动轮播,我们可以使用`Handler`和`Runnable`来定时改变`...

    android视频资讯客户端简单实现--android客户端与web服务器实现

    当网络不可用时,可以从缓存中读取数据。 9. **安全性**: - 为了保护用户数据和服务器安全,网络通信时应使用HTTPS协议,确保数据传输的加密性。 - 避免在代码中硬编码服务器地址和密钥,可以使用Android的...

    Android VolleyDemo

    当网络不可用时,Volley 会优先从缓存中读取数据。可以通过设置超时时间和缓存大小来控制缓存行为。 ### 5. 自定义请求 Volley 还允许开发者自定义请求类,以满足特定需求。自定义请求类需要继承 `Request` 类,并...

    ThinkPHP3.2.3完全开发手册.

    - **设计理念**:该框架坚持“简洁实用”的设计原则,追求高性能与简洁代码的同时,强调良好的开发体验与易用性。 - **主要特点**: - 遵循MVC架构,提供清晰的业务逻辑分离。 - 支持面向对象编程,易于维护和扩展...

    Android 7种网络连接方式

    在Android开发中,网络连接是应用与服务器交互的基础,它使得我们的应用能够获取或发送数据。本篇文章将详细探讨Android的7种主要网络连接方式,帮助开发者更好地理解和掌握这一核心技能。 1. **HttpURLConnection*...

    百度校园招聘历年经典面试题汇总:Android岗

    - **多个方法**:如果多个方法都加上`synchronized`关键字,则这些方法在同一时刻只能被一个线程访问。 #### 45. public与默认的区别 - **public**:任何地方都可以访问。 - **默认**:仅限于同一包内。 #### 46....

    自定义Glide,

    3. **加载数据**:Glide使用DataFetcher从内存、磁盘缓存或网络中获取数据,如果数据不存在,会触发下载或解码过程。 4. **转换数据**:数据在被显示之前可能需要转换,比如缩放、裁剪、颜色转换等,这些操作由...

    android Gallery实现异步加载网络图片 并只加载当前停止页面图.7z

    这里以`Picasso`为例,它提供了简洁的API用于图片加载、缓存和显示。 1. **集成Picasso库** 在`build.gradle`文件中添加Picasso依赖: ```gradle dependencies { implementation '...

    UZCMS美女图片小偷伪静态缓存版 v3.0

    "美女图片"指明了其内容定位,"小偷"在这里通常指的是自动采集网络上的优质图片资源,而"伪静态"和"缓存"则揭示了其在SEO优化和性能提升方面的策略。"v3.0"表示这是该系统的第三个主要版本,通常意味着经过多次迭代...

Global site tag (gtag.js) - Google Analytics