当前位置:首页 > 行业动态 > 正文

安卓从网络获取图片

在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)、高性能

注意事项

  1. 主线程限制
    网络请求必须在子线程执行,但Glide/Picasso等库已内置异步处理,无需手动管理。

  2. 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>
  3. 大图处理
    为避免OOM(内存溢出),可限制图片尺寸:

    Glide.with(this)
         .load(url)
         .override(800, 600) // 强制宽高
         .into(imageView);

扩展功能

  1. 监听加载状态
    使用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);
  2. 自定义缓存策略
    通过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);
0