服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - android编程实现图片库的封装方法

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

2021-04-09 14:12年轻的zhangchang Android

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
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 < threadSize; i++) {
    int startposition = i * currentSize;// 每条线程开始写入文件的位置
    RandomAccessFile threadFile = new RandomAccessFile(file, "rw");
    Log.i("syso", "toFile的内容是:" + toFile);
    threadFile.seek(startposition);
    new DownLoadThread(i, currentSize, threadFile, startposition,
      url).start();
   }
  } catch (Exception e) {
   e.printStackTrace();
   Log.i("syso", "download下载失败" + e);
  }
  return true;
 }
 /**
  * 实现线程下载
  *
  */
 private static class DownLoadThread extends Thread {
  @SuppressWarnings("unused")
  private int threadId;// 线程编号
  private int currentSize;// 每条线程的大小
  private RandomAccessFile threadFile; // 每条线程 要写入文件类
  private int startposition;// 每条线程开始写入文件的位置
  private URL url; //网络地址
  public DownLoadThread(int threadId, int currentSize,
    RandomAccessFile threadFile, int startposition, URL url) {
   this.threadId = threadId;
   this.currentSize = currentSize;
   this.threadFile = threadFile;
   this.startposition = startposition;
   this.url = url;
  }
  public void run() {
   try {
    HttpURLConnection httpUrl = (HttpURLConnection) url
      .openConnection();
    httpUrl.setRequestMethod("GET");
    httpUrl.setRequestProperty("range", "bytes=" + startposition
      + "-");// 指定服务器的位置
    InputStream is = httpUrl.getInputStream();
    byte[] data = new byte[1024];
    int len = -1;
    int threadFileSize = 0;
    while ((threadFileSize < currentSize)
      && ((len = is.read(data)) != -1)) {
     threadFile.write(data, 0, len);
     threadFileSize += len;
    }
    httpUrl.disconnect();
    is.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
 /**
 * 从本缓存中获取图片
 */
 public Bitmap getBitmapFromCache(String imageURL) {
 // String bitmapName = imageURL.substring(imageURL.lastIndexOf("/") + 1);
  String bitmapName = Utils.getFileName(imageURL);
  File cacheDir = new File(Environment.getExternalStorageDirectory() + "/"
    + EcologicalTourism.FILE_PATH + "/images/");
  File[] cacheFiles = cacheDir.listFiles();
  int i = 0;
  if(null!=cacheFiles){
   for(; i<cacheFiles.length;i++){
    if(bitmapName.equals(cacheFiles[i].getName())){
     break;
    }
   }
   if(i < cacheFiles.length)
   {
    return BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/"
      + EcologicalTourism.FILE_PATH + "/images/" + bitmapName);
   }
  }
  return null;
 }

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

延伸 · 阅读

精彩推荐
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28