Android 如何将MultiBodyPart.Part转换为图片Uri或Bitmap以在ImageView展示
实现方案
方案1(推荐):复用原始图片路径加载
你生成MultipartBody.Part时必然是基于本地图片的文件路径/Uri转换得到,直接用原始路径加载到ImageView即可,不需要从Part中读取数据,性能最优且不会出现额外的内存消耗。
可以直接用Glide、Coil等图片加载框架加载,示例代码:
// Coil 示例 imageView.load(本地图片Uri/文件路径) // Glide 示例 Glide.with(context).load(本地图片Uri/文件路径).into(imageView)
方案2:仅保留了MultipartBody.Part对象,无原始路径
需要先读取Part内部封装的二进制流,转换为Bitmap后设置到ImageView,注意流读取操作必须在子线程执行,避免阻塞主线程导致ANR。
操作步骤:
- 从Part中获取RequestBody对象:
val requestBody = part.body() - 子线程读取输入流并解码为Bitmap,切回主线程设置ImageView
Kotlin 示例(协程实现):
lifecycleScope.launch(Dispatchers.IO) { runCatching { val inputStream = requestBody.byteStream() // 可添加Bitmap采样压缩逻辑避免OOM val bitmap = BitmapFactory.decodeStream(inputStream) inputStream.close() bitmap }.onSuccess { bitmap -> withContext(Dispatchers.Main) { imageView.setImageBitmap(bitmap) } }.onFailure { // 处理加载失败逻辑 it.printStackTrace() } }
Java 示例:
new Thread(() -> { try { InputStream inputStream = part.body().byteStream(); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); // 切回主线程设置 runOnUiThread(() -> imageView.setImageBitmap(bitmap)); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } }).start();
注意:如果图片尺寸较大,直接解码全量Bitmap可能触发OOM,建议解码时添加
inSampleSize采样参数压缩,或者先把流写入本地临时文件再通过图片加载框架加载,降低内存占用。
内容的提问来源于stack exchange,提问作者dennisrufigill
相关产品推荐
相关产品推荐

