加载图片以及多线程

来了公司几个月,做了两个项目,一直没总结,现在终于有时间了。

先看一下第二个项目酷运动商城

在这个项目里面,最大的突破在于在于

  • android的列表去加载大量图片
  • 以及多线程的应用
  • activityGroup的应用,并且控制其跳转
  • 共享数据,数据库的应用,文件缓存
  • 对布局的进一步的熟悉,以及突破。

这个项目获益良多,慢慢总结。

本篇说明一下,列表加载大量的图片,以及多线程在这边的应用。

这里主要是几个问题会非常麻烦,需要我们去处理

  1. 加载图片完成后即时刷新
  2. 加载了大量的图片,却不会发生内存的溢出,OutOfMemory
  3. 多级的缓存机制
  4. 多线程的应用,提高图片的加载速度
  5. 线程池的运用,以防止开启过多的线程,使cpu的压力骤增。

加载图片并且即时刷新

这里运用到了一个懒加载 (lazy load)的技术。

也就是在图片读取完整之后,再在主的绘图线程里去设置该图片,就达到了这个效果。

// ===========================================================
// 这段代码有很多地方参考了国外一位大大的代码,不是原创。
// ===========================================================
// 这个是图片的缓存
static HashMap<String, SoftReference<Bitmap>> cache = new HashMap<String, SoftReference
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果要使用OkHttp来进行多线程缓存网络图片,可以按照以下步骤进行: 1. 引入OkHttp库,可以在app的build.gradle文件中添加以下依赖: ```groovy implementation 'com.squareup.okhttp3:okhttp:4.9.1' ``` 2. 在代码中使用OkHttp加载图片。可以通过OkHttp的Builder来配置一些参数,例如超时时间、缓存等。以下是一个加载图片的示例代码: ```java OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .cache(new Cache(context.getCacheDir(), 10 * 1024 * 1024)) // 缓存大小为10MB .build(); Request request = new Request.Builder() .url(imageUrl) .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 加载失败 } @Override public void onResponse(Call call, Response response) throws IOException { // 加载成功 InputStream inputStream = response.body().byteStream(); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); // 显示图片 imageView.post(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap); } }); } }); ``` 3. 使用多线程加载图片。可以使用Java中的ExecutorService来创建线程池,从而实现多线程加载图片。以下是一个使用线程池来加载图片的示例代码: ```java ExecutorService executorService = Executors.newFixedThreadPool(5); // 创建一个包含5个线程线程池 for (String imageUrl : imageUrlList) { executorService.execute(new Runnable() { @Override public void run() { OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .cache(new Cache(context.getCacheDir(), 10 * 1024 * 1024)) // 缓存大小为10MB .build(); Request request = new Request.Builder() .url(imageUrl) .build(); try { Response response = okHttpClient.newCall(request).execute(); InputStream inputStream = response.body().byteStream(); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); // 缓存图片到本地 File file = new File(context.getCacheDir(), getFileNameFromUrl(imageUrl)); FileOutputStream outputStream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); outputStream.flush(); outputStream.close(); // 显示图片 imageView.post(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap); } }); } catch (IOException e) { e.printStackTrace(); } } }); } executorService.shutdown(); // 关闭线程池 executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // 等待所有线程执行完毕 ``` 其中,上述代码中的getFileNameFromUrl()方法可以根据图片的URL地址获取图片的文件名,用于在本地缓存中保存图片。例如: ```java private String getFileNameFromUrl(String url) { int index = url.lastIndexOf("/"); return url.substring(index + 1); } ``` 通过以上方式,即可使用OkHttp进行多线程缓存网络图片的操作。需要注意的是,如果要缓存图片,需要在OkHttpClient中设置缓存目录和缓存大小。另外,为了避免内存泄漏,需要在使用完OkHttpClient之后,及时关闭和释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值