我前面的博客写了网络获取图片的方法(见:
《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 ;
}
分享到:
相关推荐
默认情况下,当图片从网络加载后,Glide会将其存储在内部缓存中,以便下次再次请求同一图片时能快速从缓存中获取,无需重新下载,从而提升应用性能。 内部缓存机制是通过LruCache(最近最少使用)来管理内存缓存,...
在Android应用开发中,图片加载和缓存是一个关键部分,特别是在处理大量图片或者网络图片时。本主题将详细探讨如何利用开源的图片缓存框架来优化这一过程,以提高用户体验和应用性能。我们将重点关注以下几个方面: ...
本压缩包“安卓Android源码——listview获取网络图片缓存优化.zip”提供了一个针对这个问题的解决方案,旨在通过优化代码来提升用户体验。 首先,我们要理解ListView的工作原理。ListView采用了一种叫做"视图复用...
总之,Android自定义ListView从服务端获取图片涉及网络请求、图片加载库、缓存策略、ListView优化等多个环节,需要综合考虑性能和用户体验。通过熟练掌握这些技术,我们可以创建出高效、流畅的ListView应用。
- 实现`TileProvider`接口,重写`getTile`方法,动态构造谷歌卫星图瓦片的URL,并使用HTTP请求获取图片数据。 - 将返回的Bitmap对象添加到TileOverlay,显示在地图上。 3. **缓存谷歌卫星瓦片**: - 为了提高...
例如,当需要从网络获取用户信息并显示在界面上时,可以先发起网络请求,然后将返回的JSON数据解析成对应的User对象,最后利用`@InjectView`注解绑定的TextView显示用户信息。同时,如果用户信息包含头像URL,`...
内存缓存可以在短时间内快速获取图片,而磁盘缓存则用于存储大量图片,即使应用关闭后仍能读取。`LruCache`是Android提供的一个基于最近最少使用原则的内存缓存实现,而`DiskLruCache`则用于磁盘缓存。 4. **图片库...
- **Web缓存与P2P缓存的区别**:传统的Web缓存类似于CDN技术,主要用于网页、图片、普通下载以及视频等内容的加速;而P2P缓存则更侧重于下载(例如BT下载)和视频播放(如QVOD、百度影音等),通过用户间互相分享...
- 创建一个Thread对象,重写`run()`方法来实现网络下载逻辑。使用Handler或Runnable配合Looper可以在完成下载后与主线程通信,更新UI。 5. **图片解码与缓存**: - 下载的图片数据通常是字节数组,需要解码为...
- 使用Volley创建网络请求非常简单,只需继承`Request`类并重写相应的方法,例如`getParams()`用于设置POST请求的数据,`parseNetworkResponse()`用于解析网络响应。 - `JsonObjectRequest`和`JsonArrayRequest`等...
Matisse作为一款优秀的Android本地图片选择器,其简洁的设计、强大的功能和良好的可定制性,使得它成为开发者实现图片选择功能的首选。无论是在小规模项目还是大型应用中,都能看到Matisse的身影,为提升用户体验和...
在这个方法中,我们可以根据当前选中的页面位置进行调整,如果已经到达列表末尾,就重新从头开始,反之亦然,从而实现无限循环的效果。 此外,为了让广告自动轮播,我们可以使用`Handler`和`Runnable`来定时改变`...
当网络不可用时,可以从缓存中读取数据。 9. **安全性**: - 为了保护用户数据和服务器安全,网络通信时应使用HTTPS协议,确保数据传输的加密性。 - 避免在代码中硬编码服务器地址和密钥,可以使用Android的...
当网络不可用时,Volley 会优先从缓存中读取数据。可以通过设置超时时间和缓存大小来控制缓存行为。 ### 5. 自定义请求 Volley 还允许开发者自定义请求类,以满足特定需求。自定义请求类需要继承 `Request` 类,并...
- **设计理念**:该框架坚持“简洁实用”的设计原则,追求高性能与简洁代码的同时,强调良好的开发体验与易用性。 - **主要特点**: - 遵循MVC架构,提供清晰的业务逻辑分离。 - 支持面向对象编程,易于维护和扩展...
在Android开发中,网络连接是应用与服务器交互的基础,它使得我们的应用能够获取或发送数据。本篇文章将详细探讨Android的7种主要网络连接方式,帮助开发者更好地理解和掌握这一核心技能。 1. **HttpURLConnection*...
- **多个方法**:如果多个方法都加上`synchronized`关键字,则这些方法在同一时刻只能被一个线程访问。 #### 45. public与默认的区别 - **public**:任何地方都可以访问。 - **默认**:仅限于同一包内。 #### 46....
3. **加载数据**:Glide使用DataFetcher从内存、磁盘缓存或网络中获取数据,如果数据不存在,会触发下载或解码过程。 4. **转换数据**:数据在被显示之前可能需要转换,比如缩放、裁剪、颜色转换等,这些操作由...
这里以`Picasso`为例,它提供了简洁的API用于图片加载、缓存和显示。 1. **集成Picasso库** 在`build.gradle`文件中添加Picasso依赖: ```gradle dependencies { implementation '...
"美女图片"指明了其内容定位,"小偷"在这里通常指的是自动采集网络上的优质图片资源,而"伪静态"和"缓存"则揭示了其在SEO优化和性能提升方面的策略。"v3.0"表示这是该系统的第三个主要版本,通常意味着经过多次迭代...