Android_异步加载网络图片并缓存到本地_第1页
Android_异步加载网络图片并缓存到本地_第2页
Android_异步加载网络图片并缓存到本地_第3页
Android_异步加载网络图片并缓存到本地_第4页
Android_异步加载网络图片并缓存到本地_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android 异步加载网络图片并缓存到本地摘要:在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片。在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片。软引用是一个现在非常流行的方法,用户体验比较好,不用每次都需要从网络下载图片,如果下载后就存到本地,下次读取时首先查看本地有没有,如果没有再从网络读取。记得2月份在和爱奇艺公司的项目总监一起搞联通的OTT盒子的时候他就提了一下软引用,奇艺做的手机客户端就是采用这种方法,所以你会发现奇艺客户端占

2、用很大的空间,下面就分享一下异步加载网络图片的方法吧。FileCache.javajava view plaincopy .import java.io.File; .import android.content.Context; .public class FileCache .private File cacheDir; .public FileCache(Context context) ./ 找一个用来缓存图片的路径 .if (android.os.Environment.getExternalStorageState().equals( .android.os.Environment

3、.MEDIA_MOUNTED) .cacheDir = new File(android.os.Environment.getExternalStorageDirectory(), .文件夹名称); .else .cacheDir = context.getCacheDir(); .if (!cacheDir.exists() .cacheDir.mkdirs(); . .public File getFile(String url) .String filename = String.valueOf(url.hashCode(); .File f = new File(cacheDir, f

4、ilename); .return f; . .public void clear() .File files = cacheDir.listFiles(); .if (files = null) .return; .for (File f : files) .f.delete(); . . .HttpUtil.javajava view plaincopy .import java.io.ByteArrayOutputStream; .import java.io.File; .import java.io.FileNotFoundException; .import java.io.Fil

5、eOutputStream; .import java.io.IOException; .import java.io.InputStream; .import java.io.OutputStream; .import java.io.UnsupportedEncodingException; .import .HttpURLConnection; .import .MalformedURLException; .import .ProtocolException; .import .URL; .import .

6、URLEncoder; .import java.util.Map; ./* .* Http 请求工具类 .* .* author Scorpio.Liu .* .*/ .public class HttpUtil ./* .* 获取响应字符串 .* .* param path .* 路径 .* param parameters .* 参数 .* return 响应字符串 .*/ .public static String getResponseStr(String path, Map parameters) .StringBuffer buffer = new StringBuffer();

7、 .URL url; .try .if (parameters != null & !parameters.isEmpty() .for (Map.Entry entry : parameters.entrySet() ./ 完成转码操作 .buffer.append(entry.getKey().append(=) .append(URLEncoder.encode(entry.getValue(), UTF-8).append(&); . .buffer.deleteCharAt(buffer.length() - 1); . .url = new URL(path); .HttpURLC

8、onnection urlConnection = (HttpURLConnection) url.openConnection(); .urlConnection.setConnectTimeout(3000); .urlConnection.setRequestMethod(POST); .urlConnection.setDoInput(true);/ 表示从服务器获取数据 .urlConnection.setDoOutput(true);/ 表示向服务器写数据 ./ 获得上传信息的字节大小以及长度 .byte mydata = buffer.toString().getBytes();

9、 ./ 表示设置请求体的类型是文本类型 .urlConnection.setRequestProperty(Content-Type, .application/x-www-form-urlencoded); .urlConnection.setRequestProperty(Content-Length, String.valueOf(mydata.length); ./ 获得输出流,向服务器输出数据 .OutputStream outputStream = urlConnection.getOutputStream(); .outputStream.write(mydata, 0, myd

10、ata.length); .outputStream.close(); .int responseCode = urlConnection.getResponseCode(); .if (responseCode = 200) .return changeInputStream(urlConnection.getInputStream(); . . catch (UnsupportedEncodingException e) .e.printStackTrace(); . catch (MalformedURLException e) .e.printStackTrace(); . catch

11、 (ProtocolException e) .e.printStackTrace(); . catch (IOException e) .e.printStackTrace(); . .return null; . .private static String changeInputStream(InputStream inputStream) .ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); .byte data = new byte1024; .int len = 0; .String result =

12、; .if (inputStream != null) .try .while (len = inputStream.read(data) != -1) .outputStream.write(data, 0, len); . .result = new String(outputStream.toByteArray(), UTF-8); . catch (IOException e) .e.printStackTrace(); . . .return result; . .public static InputStream getInputStream(String path) .URL u

13、rl; .try .url = new URL(path); .HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); .urlConnection.setConnectTimeout(3000); .urlConnection.setRequestMethod(GET); .urlConnection.setDoInput(true);/ 表示从服务器获取数据 .urlConnection.connect(); .if (urlConnection.getResponseCode() = 200)

14、 .return urlConnection.getInputStream(); . catch (MalformedURLException e) ./ TODO Auto-generated catch block .e.printStackTrace(); . catch (IOException e) ./ TODO Auto-generated catch block .e.printStackTrace(); . catch (Exception e) ./ TODO Auto-generated catch block .e.printStackTrace(); . .retur

15、n null; . .public static byte readStream(InputStream inStream) throws Exception .ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); .byte buffer = new byte1024; .int len = -1; .while (len = inStream.read(buffer) != -1) .outSteam.write(buffer, 0, len); . .outSteam.close(); .inStream.close(

16、); .return outSteam.toByteArray(); . .public static void CopyStream(String url, File f) .FileOutputStream fileOutputStream = null; .InputStream inputStream = null; .try .inputStream = getInputStream(url); .byte data = new byte1024; .int len = 0; .fileOutputStream = new FileOutputStream(f); .while (l

17、en = inputStream.read(data) != -1) .fileOutputStream.write(data, 0, len); . . catch (FileNotFoundException e) .e.printStackTrace(); . catch (IOException e) .e.printStackTrace(); . finally .if (inputStream != null) .try .inputStream.close(); . catch (IOException e) .e.printStackTrace(); . . .if (file

18、OutputStream != null) .try .fileOutputStream.close(); . catch (IOException e) .e.printStackTrace(); . . . . . .MemoryCache.javajava view plaincopy .import java.lang.ref.SoftReference; .import java.util.Collections; .import java.util.HashMap; .import java.util.Map; .import android.graphics.Bitmap; .p

19、ublic class MemoryCache .private MapString, SoftReference cache = Collections .synchronizedMap(new HashMapString, SoftReference();/ 软引用 .public Bitmap get(String id) .if (!cache.containsKey(id) .return null; .SoftReference ref = cache.get(id); .return ref.get(); . .public void put(String id, Bitmap

20、bitmap) .cache.put(id, new SoftReference(bitmap); . .public void clear() .cache.clear(); . . .ImageLoader.javajava view plaincopy .import java.io.File; .import java.io.FileInputStream; .import java.io.FileNotFoundException; .import java.io.UnsupportedEncodingException; .import .URLEncoder; .

21、import java.util.Collections; .import java.util.Map; .import java.util.WeakHashMap; .import java.util.concurrent.ExecutorService; .import java.util.concurrent.Executors; .import android.app.Activity; .import android.content.Context; .import android.graphics.Bitmap; .import android.graphics.BitmapFac

22、tory; .import android.graphics.drawable.BitmapDrawable; .import android.widget.ImageView; .public class ImageLoader .private MemoryCache memoryCache = new MemoryCache(); .private FileCache fileCache; .private Map imageViews = Collections .synchronizedMap(new WeakHashMap(); .private ExecutorService e

23、xecutorService; .private boolean isSrc; ./* .* param context .* 上下文对象 .* param flag .* true为source资源,false为background资源 .*/ .public ImageLoader(Context context, boolean flag) .fileCache = new FileCache(context); .executorService = Executors.newFixedThreadPool(5); .isSrc = flag; . .final int stub_id

24、= R.drawable.ic_launcher; .public void DisplayImage(String url, ImageView imageView) .String u1 = url.substring(0, url.lastIndexOf(/) + 1); .String u2 = url.substring(url.lastIndexOf(/) + 1); .try .u2 = URLEncoder.encode(u2, UTF-8); . catch (UnsupportedEncodingException e) .e.printStackTrace(); . .u

25、rl = u1 + u2; .imageViews.put(imageView, url); .Bitmap bitmap = memoryCache.get(url); .if (bitmap != null) .if (isSrc) .imageView.setImageBitmap(bitmap); .else .imageView.setBackgroundDrawable(new BitmapDrawable(bitmap); . else .queuePhoto(url, imageView); .if (isSrc) .imageView.setImageResource(stu

26、b_id); .else .imageView.setBackgroundResource(stub_id); . . .private void queuePhoto(String url, ImageView imageView) .PhotoToLoad p = new PhotoToLoad(url, imageView); .executorService.submit(new PhotosLoader(p); . .private Bitmap getBitmap(String url) .try .File f = fileCache.getFile(url); ./ 从sd卡

27、.Bitmap b = onDecodeFile(f); .if (b != null) .return b; ./ 从网络 .Bitmap bitmap = null; .System.out.println(ImageLoader-download); .HttpUtil.CopyStream(url, f); .bitmap = onDecodeFile(f); .return bitmap; . catch (Exception ex) .ex.printStackTrace(); .return null; . . .public Bitmap onDecodeFile(File f

28、) .try .return BitmapFactory.decodeStream(new FileInputStream(f); . catch (FileNotFoundException e) ./ TODO Auto-generated catch block .e.printStackTrace(); . .return null; . ./* .* 解码图像用来减少内存消耗 .* .* param f .* return .*/ .public Bitmap decodeFile(File f) .try ./ 解码图像大小 .BitmapFactory.Options o = n

29、ew BitmapFactory.Options(); .o.inJustDecodeBounds = true; .BitmapFactory.decodeStream(new FileInputStream(f), null, o); ./ 找到正确的刻度值,它应该是2的幂。 .final int REQUIRED_SIZE = 70; .int width_tmp = o.outWidth, height_tmp = o.outHeight; .int scale = 1; .while (true) .if (width_tmp / 2 REQUIRED_SIZE | height_t

30、mp / 2 REQUIRED_SIZE) .break; .width_tmp /= 2; .height_tmp /= 2; .scale *= 2; . .BitmapFactory.Options o2 = new BitmapFactory.Options(); .o2.inSampleSize = scale; .return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); . catch (FileNotFoundException e) . .return null; . ./* .* 任务队列 .*

31、.* author Scorpio.Liu .* .*/ .private class PhotoToLoad .public String url; .public ImageView imageView; .public PhotoToLoad(String u, ImageView i) .url = u; .imageView = i; . . .class PhotosLoader implements Runnable .PhotoToLoad photoToLoad; .PhotosLoader(PhotoToLoad photoToLoad) .this.photoToLoad = photoToLoad; . .Override .public void run() .if (imageViewReused(photoToLoad) .return; .Bitmap bmp = getBitmap(photoToLoad.url); .memoryCache.put(photoToLoad.url, b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论