- 从服务器获取图片的 URL/路径信息。
- 使用这个 URL/路径在 Android 客户端加载并显示图片。
下面我将详细解释这两个步骤,并提供完整的代码示例和最佳实践。

第一步:从服务器获取图片路径
你的服务器会提供一个 API(接口),客户端通过调用这个 API 来获取图片的相关信息,这个信息通常不是一个本地文件路径(如 /sdcard/images/abc.jpg),而是一个网络 URL(如 https://your-server.com/images/abc.jpg)。
服务器端 API 设计
服务器 API 应该返回一个 JSON 格式的响应,其中包含图片的 URL。
示例 API 端点: https://api.yourserver.com/get-image
成功响应示例 (JSON):

{
"status": "success",
"data": {
"image_id": "12345",
"image_url": "https://your-server.com/assets/images/banner_v2.jpg",
"image_title": "Welcome Banner",
"thumbnail_url": "https://your-server.com/assets/images/thumbnails/banner_v2_thumb.jpg"
}
}
在这个例子中,客户端需要解析 data.image_url 字段来获取图片的完整网络路径。
Android 客户端请求 API
在 Android 中,我们通常使用现代的网络请求库,如 Retrofit + OkHttp,来处理网络请求,它们比传统的 HttpURLConnection 更简洁、更强大。
添加依赖到 app/build.gradle 文件:
// Retrofit for networking implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // For JSON parsing // OkHttp for logging (optional, but very useful for debugging) implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3' // Glide or Picasso for image loading (highly recommended) // We'll use Glide in this example implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
创建数据模型类 (POJO) 来映射 JSON 响应:

// ApiResponse.kt
data class ApiResponse(
val status: String,
val data: ImageData
)
// ImageData.kt
data class ImageData(
val image_id: String,
val image_url: String,
val image_title: String,
val thumbnail_url: String
)
创建 Retrofit 接口:
// ApiService.kt
import retrofit2.http.GET
interface ApiService {
@GET("get-image")
suspend fun getImage(): ApiResponse // Using suspend for coroutines
}
在 ViewModel 或 Repository 中发起网络请求:
// MyViewModel.kt
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class MyViewModel : ViewModel() {
private val _imageUrl = MutableLiveData<String>()
val imageUrl: LiveData<String> = _imageUrl
private val _errorMessage = MutableLiveData<String>()
val errorMessage: LiveData<String> = _errorMessage
private val apiService: ApiService by lazy {
// 创建 Retrofit 实例
val retrofit = Retrofit.Builder()
.baseUrl("https://api.yourserver.com/") // 必须以 /
.addConverterFactory(GsonConverterFactory.create())
.build()
retrofit.create(ApiService::class.java)
}
fun fetchImageUrl() {
viewModelScope.launch {
try {
val response = apiService.getImage()
if (response.status == "success") {
// 成功获取到 URL,存入 LiveData
_imageUrl.value = response.data.image_url
} else {
_errorMessage.value = "Server returned an error: ${response.status}"
}
} catch (e: Exception) {
// 处理网络错误或解析错误
_errorMessage.value = "Failed to fetch image: ${e.message}"
}
}
}
}
第二步:使用图片 URL 加载并显示图片
获取到图片 URL 后,最关键的一步是高效、流畅地将它显示在 ImageView 上。强烈不建议使用 AsyncTask + BitmapFactory 的旧方式,因为它容易导致内存泄漏和 OutOfMemoryError。
推荐使用成熟的图片加载库,它们能自动处理缓存(内存缓存和磁盘缓存)、线程管理、图片压缩和生命周期感知。
这里我们使用 Glide 作为示例。
在 XML 布局文件中添加 ImageView
<!-- activity_main.xml -->
<ImageView
android:id="@+id/myImageView"
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop" />
在 Activity 或 Fragment 中使用 Glide 加载图片
// MainActivity.kt
import android.os.Bundle
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
// 使用 Ktx 库轻松获取 ViewModel 实例
private val myViewModel: MyViewModel by viewModels()
private lateinit var myImageView: ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
myImageView = findViewById(R.id.myImageView)
// 观察 ViewModel 中的 imageUrl 和 errorMessage
myViewModel.imageUrl.observe(this) { url ->
url?.let {
// 当获取到 URL 时,使用 Glide 加载图片
Glide.with(this)
.load(it) // 这里传入的就是从服务器获取的图片 URL
.placeholder(R.drawable.placeholder) // 加载中的占位图
.error(R.drawable.error_image) // 加载失败时的错误图
.into(myImageView) // 目标 ImageView
}
}
myViewModel.errorMessage.observe(this) { message ->
message?.let {
Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
}
}
// 开始请求
myViewModel.fetchImageUrl()
}
}
总结与最佳实践
- 核心概念:Android 获取的不是服务器本地路径,而是图片的网络 URL。
- 网络请求:使用 Retrofit 处理 API 请求,定义数据模型(POJO)来解析 JSON 响应,推荐使用 Kotlin Coroutines 或 RxJava 进行异步操作。
- 图片加载:绝对不要手动解析和加载图片,使用成熟的图片加载库,如 Glide 或 Picasso。
- Glide:性能优秀,支持 GIF,API 简洁,是当前的主流选择。
- Picasso:老牌库,稳定可靠。
- Coil:一个较新的库,完全使用 Kotlin 编写,性能也很好,可以作为一个现代化的选择。
- 架构分离:将网络请求逻辑放在 Repository 或 ViewModel 中,将 UI 显示逻辑放在 Activity/Fragment 中,遵循 MVVM 或 MVI 架构,使代码更清晰、更易于维护。
- 错误处理:始终处理网络请求可能出现的异常(如无网络、服务器错误)和图片加载失败的情况,并提供用户友好的反馈(如 Toast 或错误图)。
- 生命周期:在
Activity/Fragment的onDestroy或onStop中,如果图片加载是异步的,最好取消它,以避免内存泄漏,Glide 和 Coil 会自动处理与LifecycleOwner(如 Activity/Fragment)的生命周期绑定,你无需手动取消。
通过以上步骤,你就可以稳健地在 Android 应用中从服务器获取并显示图片了。
