我在活动1中有一个名为bmp
的位图变量,我想将该位图发送到活动2
下面是我使用Intent传递它的代码。
Intent in1 = new Intent(this, Activity2.class);
in1.putExtra("image",bmp);
startActivity(in1);
在练习2中,我尝试使用以下代码访问位图
Bundle ex = getIntent().getExtras();
Bitmap bmp2 = ex.getParceable("image");
ImageView result = (ImageView)findViewById(R.Id.imageView1);
result.setImageBitmap(bmp);
应用程序正常运行,但未给予预期结果
8条答案
按热度按时间avkwfej41#
在将其添加到Intent、发送出去并解码之前,请将其转换为Byte数组。
然后在活动2中:
我想我应该用最佳实践来更新这个:
在第一个练习中,您应该将位图保存到磁盘,然后在下一个练习中加载它。请确保在第一个练习中回收位图,以便为垃圾回收做好准备:
活动一:
在活动2中,加载位图:
cfh9epnr2#
有时,位图可能太大,无法进行编码和解码,或在Intent中作为字节数组传递。这可能会导致OOM或糟糕的UI体验。
我建议考虑将位图放入新Activity(使用它的Activity)的静态变量中,当您不再需要它时,该变量将谨慎地为null(这意味着在onDestroy中,但仅当“isChangingConfigurations”返回false时)。
qlzsbp2j3#
简单地说,我们可以只传递位图的URI,而不是传递位图对象。如果位图对象很大,这将导致内存问题。
第一个活动。
从SecondActivity中,我们返回位图。
5kgi1eie4#
用于将位图发送到另一个Activity的Kotlin代码:
1-在第一个活动中:
2-在活动二(读取位图图像)中:
3-如果需要将其设置为视图的背景,如ConstraintLayout或...:
jmp7cifd5#
我们也可以在不通过Intent传递数据的情况下解决这个问题,只需将图像存储在内存中,并在下一个Activity中从该位置加载图像,这样也可以避免应用因传递大型位图数据而崩溃。您甚至不需要将位置路径传递给Intent,只需记住路径并使用它。
vq8itlhq6#
我还想为那些希望这样做的人发布一个最佳实践答案(但可能问错了问题)。
不要传递位图(我假设您是从网络下载的,否则,您已经有了一个文件引用),我建议使用像Universal Image Loader这样的图像加载器将图像下载到ImageView中,您可以配置它,然后将图像缓存到磁盘:
现在,只需在Intent中传递图像URL,然后使用UIL加载图像。例如,在新创建的Activity中,图像将立即加载,因为它是该高速缓存加载的,即使图像URL在下载后已过期。
goqiplq27#
创建用于存储位图数据的单例类
在第一个练习中,您可以这样设置。
在第二个活动中
注:检查空值
jdzmm42g8#