上一篇
安卓从网络获取图片
- 行业动态
- 2025-04-24
- 1
在Android中从网络获取图片需先在AndroidManifest添加INTERNET权限,通过HttpURLConnection或第三方库(如Glide、Picasso)发起网络请求,将图片流转换为Bitmap后显示到ImageView,注意需在子线程处理网络操作
安卓从网络获取图片的实现方案
权限配置
在AndroidManifest.xml中声明网络权限:
<uses-permission android:name="android.permission.INTERNET" />
使用Glide加载网络图片
添加依赖
在build.gradle
中添加Glide库:
implementation 'com.github.bumptech.glide:glide:4.15.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'
布局文件
在XML中定义ImageView
:
<ImageView android:id="@+id/imageView" android:layout_width="200dp" android:layout_height="200dp" android:scaleType="centerCrop"/>
代码实现
在Activity或Fragment中加载图片:
ImageView imageView = findViewById(R.id.imageView); String url = "https://example.com/image.jpg"; // 基础用法(自动处理缓存、缩放、失败重试) Glide.with(this) .load(url) .placeholder(R.drawable.placeholder) // 加载中的占位图 .error(R.drawable.error) // 加载失败的占位图 .into(imageView);
其他图片加载库对比
库名 | 特点 |
---|---|
Glide | 支持GIF/WebP、自动缓存、高效内存管理、链式调用 |
Picasso | 轻量级、简单易用、无GIF支持 |
Coil | 基于Kotlin、支持现代Android特性(如Flow)、高性能 |
注意事项
主线程限制
网络请求必须在子线程执行,但Glide/Picasso等库已内置异步处理,无需手动管理。HTTP网络安全配置
如果加载HTTP图片(非HTTPS),需在AndroidManifest.xml
中配置:<application> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">example.com</domain> </domain-config> </network-security-config> </application>
大图处理
为避免OOM(内存溢出),可限制图片尺寸:Glide.with(this) .load(url) .override(800, 600) // 强制宽高 .into(imageView);
扩展功能
监听加载状态
使用RequestListener
获取加载回调:Glide.with(this) .load(url) .listener(new RequestListener<Drawable>() { @Override public boolean onLoadFailed(GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { Log.e("Glide", "加载失败"); return false; // 返回false让Glide处理错误 } @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { Log.d("Glide", "加载成功"); return false; // 返回false让Glide继续处理 } }) .into(imageView);
自定义缓存策略
通过Glide
设置缓存目录和大小:Glide.get(this).setDiskCache(new InternalCacheDiskCacheFactory(this, "glide_cache", 1024 1024 50)); // 50MB缓存
相关问题与解答
问题1:如何判断图片是否来自网络缓存?
解答:
Glide默认优先使用缓存,可通过DataSource
判断资源来源:
RequestListener<Drawable> listener = new RequestListener<Drawable>() { @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { if (dataSource == DataSource.MEMORY_CACHE) { Log.d("Glide", "图片来自内存缓存"); } else if (dataSource == DataSource.DATA_DISK_CACHE) { Log.d("Glide", "图片来自磁盘缓存"); } return false; } // onLoadFailed省略 }; Glide.with(this).load(url).listener(listener).into(imageView);
问题2:如何动态替换网络图片的URL?
解答:
直接调用setImageDrawable(null)
清空ImageView
,再重新加载新URL:
// 替换URL前清空旧图片 imageView.setImageDrawable(null); // 加载新URL String newUrl = "https://example.com/new_image.jpg"; Glide.with(this).load(newUrl).into(imageView);