热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

android编程实现图片库的封装方法

这篇文章主要介绍了android编程实现图片库的封装方法,涉及Android针对图片的下载、保存、获取及操作缓存图片等相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了android编程实现图片库的封装方法。分享给大家供大家参考,具体如下:

大家在做安卓应用的时候 经常要从网络中获取图片 都是通过URL去获取 可是如果本地有图片数据 从本地获取数据不更加快一些 自己在工作中遇到这个问题 所以采用了一个URL和本地图片的一个映射关系 先从本地区获取 假如本地没有再从网络中获取 本方法考虑到多线程问题 欢迎大家一起共同探讨!

public class PictureLibrary {
 /*
  * 图片库的操作
  */
 File file;
 URL url;
 HttpURLConnection conn;
 InputStream is;
 FileOutputStream fos;
 private Lock lock = new ReentrantLock();
 private Condition downFile = lock.newCondition();
 // 通过URL将数据下载到本地操作
 private String toLocalFile(String strURL) {
  String fileName = Utils.getFileName(strURL);
  String path = Environment.getExternalStorageDirectory() + "/"
    + EcologicalTourism.FILE_PATH + "/images/" + fileName;
  return path;
 }
 // 通过URL将数据下载到本地临时文件中
 private String toLocalFileTemp(String strURL) {
  String s = Utils.getFileName(strURL);
  String fileName = s+"temp";
  String path_url = Environment.getExternalStorageDirectory() + "/"
    + EcologicalTourism.FILE_PATH + "/tempimages/" + fileName;
  return path_url;
 }
 /*
  * 保存图片到本地,并返回本地url(此函数是阻塞的)
  * main
  * @参数:strURL,参数为图片的URL.返回值:该图片在本地SD卡暂存的位置
  * 函数的工作是负责将图片从互联网上取得,存在本地存储中,并返回本地存储的文件路径,供调用者直接使用。如果文件已经存在本地,直接返回
  * 如果文件未在本地,则直接从服务器下载,函数阻塞。
  */
 public String getReadSD(String strURL) {
  Log.i("test", "拿到网络的地址是:" + strURL);
  String strLocalFile = toLocalFile(strURL); //k:把服务器URL转换为本地URL
  String strLocalFileTemp = toLocalFileTemp(strURL); //k:把服务器URL转换为本地临时URL
  while (true) {
   File file = new File(strLocalFile);
   Log.i("test", "本地文件是:" + strLocalFile);
   File tfile = new File(strLocalFileTemp);
   Log.i("test", "临时文件是:" + strLocalFileTemp);
   // 1上锁
   lock.lock();
   if (file.exists()) {
    // 2if 本地文件存在
    // 解锁
    // 返回本地路径
    lock.unlock();
    Log.i("test", "返回本地路径:" + file);
    return strLocalFile;
   } else if (tfile.exists()) {
    // if 对应的暂存文件存在
    // 解锁
    lock.unlock();
    try {
     // 睡眠
     downFile.await();
    } catch (Exception e) {
      e.printStackTrace();
     Log.i("test", "e 出现了异常1" + e);
    }
   } else {
    try {
     // 创建对应的暂存文件
     tfile.createNewFile();
    } catch (IOException e) {
     Log.i("test", "e 出现了异常2" + e);
    }
    // 解锁
    lock.unlock();
    // 下载文件内容到暂存文件中
    downURL2(strURL, strLocalFile);
    // 上锁
    lock.lock();
    // 修改暂存文件名字为本地文件名
    tfile.renameTo(file);
    // 解锁
    lock.unlock();
   }
  }
 }
 private void downURL2(String strURL, String strLocalFileTemp) {
  // TODO Auto-generated method stub
  URL url;
  try {
   url = new URL(strURL);
   HttpURLConnection cOnn= (HttpURLConnection) url.openConnection();
   conn.setConnectTimeout(5000);
   conn.setRequestMethod("GET");
   conn.setDoInput(true);
   if (conn.getResponseCode() == 200) {
     InputStream is = conn.getInputStream();
     FileOutputStream fos = new FileOutputStream(strLocalFileTemp);
     byte[] buffer = new byte[1024];
     int len = 0;
     while ((len = is.read(buffer)) != -1) {
       fos.write(buffer, 0, len);
     }
     is.close();
     fos.close();
     // 返回一个URI对象
   }
  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ProtocolException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 /*
  * 阻塞式下载url到文件 toFile中
  */
 private boolean downURL(String strURL, String toFile) {
  URL url;
  try {
   url = new URL(strURL);
   HttpURLConnection httpUrl = (HttpURLConnection) url
     .openConnection();
   httpUrl.setRequestMethod("GET");
   int fileSize = httpUrl.getContentLength();// 文件大小
   httpUrl.disconnect();// 关闭连接
   int threadSize = 6;// 默认设置6个线程
   threadSize = fileSize % threadSize == 0 ? threadSize
     : threadSize + 1;
   int currentSize = fileSize / threadSize; // 每条线程下载大小
   String dowloadir = Environment.getExternalStorageDirectory() + "/"
     + EcologicalTourism.FILE_PATH + "/images/";
   File dir = new File(dowloadir);
   if (!dir.exists()) {
    dir.mkdirs();
   }
   File file = new File(dir, toFile);
   RandomAccessFile randomFile = new RandomAccessFile(file, "rw");
   randomFile.setLength(fileSize);// 指定 file 文件的大小
   for (int i = 0; i 

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • ZooKeeper 入门指南
    本文将详细介绍ZooKeeper的工作机制、特点、数据结构以及常见的应用场景,包括统一命名服务、统一配置管理、统一集群管理、服务器动态上下线和软负载均衡。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 本文详细介绍了在 React Native 开发过程中遇到的 'Could not connect to development server' 错误及其解决方法。该问题不仅影响开发效率,而且难以通过网络资源找到确切的解决方案。本文将提供详细的步骤,帮助开发者快速解决这一常见问题。 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • 本文介绍了如何在GitHub上设置多个SSH Key,以解决原有Key失效的问题,并确保不同项目使用不同的私钥进行安全访问。 ... [详细]
  • Redis 脑裂现象及其应对策略
    本文探讨了 Redis 集群中的脑裂现象及其解决方案,包括脑裂的成因、影响以及如何通过配置项防止脑裂的发生。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • Ping 命令的高级用法与技巧
    本文详细介绍了 Ping 命令的各种高级用法和技巧,帮助读者更好地理解和利用这一强大的网络诊断工具。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • MicrosoftDeploymentToolkit2010部署培训实验手册V1.0目录实验环境说明3实验环境虚拟机使用信息3注意:4实验手册正文说 ... [详细]
author-avatar
昧凉生丶楚_139
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有