【发布时间】:2017-01-03 20:27:21
【问题描述】:
是否可以将Image 作为附加项传递给活动?
对于字符串,它是这样工作的:
intent = new Intent(this, 2Activity.class);
intent.putExtra("String", "xy");
startActivity(intent);
那么可以为图像做到这一点吗?还是图像的记忆有问题?
【问题讨论】:
标签: android image android-intent
是否可以将Image 作为附加项传递给活动?
对于字符串,它是这样工作的:
intent = new Intent(this, 2Activity.class);
intent.putExtra("String", "xy");
startActivity(intent);
那么可以为图像做到这一点吗?还是图像的记忆有问题?
【问题讨论】:
标签: android image android-intent
通过 Intent 传递的数据大小有限制,因此它可能不起作用。执行此操作的正常方法是传递图像的文件名或资源 ID。
【讨论】:
好问题。首先,没有Image 类,所以我不确定这是否来自您所包含的库。你的意思是Bitmap?
答案通常是不,你不能。该代码序列是一个进程间调用,它通过 Android 的绑定器内核驱动程序传递参数。参数大小有 1MiB 的硬性限制。如果您将图像保持在较小的位置,这是可能的,但请考虑Bitmap 是图像的未压缩表示,因此即使您认为尺寸合理的图像在内存中也会相当大。还要考虑到所有进出您的进程的 IPC 共享 1MiB 缓冲区。如果您的应用程序的某些其他组件正在执行 IPC,它将减少可用缓冲区。
考虑传递可用于读取图像数据的ParcelFileDescriptor、指向可提供图像数据的内容提供程序的content:// URI(请参阅openFile())或指向文件系统上的图像数据。
【讨论】:
当然可以。要么作为一个字符串,要么创建某种包装器并实现 parcelable ......也就是说 Bitmap 已经是 Parcelable ......
但是不要这样做!这实际上让我失去了一次工作面试。 this question points out 有 1MB 的限制。您的图像可能会通过。您应该做的是将其保存为文件并传递 URI。或者将文件存储在应用层。传递 URI,这是干净的方式。
看到这个SO for URI.
【讨论】:
Bitmap 已经是 Parcelable。如果数据不是Bitmap,您已经可以将byte[] 放入可打包的Bundle。
正如其他人在这里解释的那样,内存将是一个问题。要解决这个问题,您可以将图像存储在哈希图中并在片段和活动之间传递密钥。
您可以使用此包装类将图像保存在内存中。
public class DataWrapper {
private static final DataWrapper instance = new DataWrapper();
private final SparseArray<Object> map = new SparseArray<Object>();
private int currentKeyValue = 1;
public static DataWrapper getInstance() {
return instance;
}
public int putData(final Object data) {
++currentKeyValue;
map.put(currentKeyValue, data);
return currentKeyValue;
}
public Object getData(final int key) {
final Object ret = map.get(key);
map.delete(key);
return ret;
}
}
您可以像这样将数据放入包装器中:
final byte[] imageData;
final int imageDataKey = DataWrapper.getInstance().putData(imageData);
data.putExtra(EXTRA_IMAGE, imageDataKey);
您可以像这样从包装器中获取数据:
final int imageDataKey = data.getIntExtra(CameraFragment.EXTRA_IMAGE, 0);
final byte[] data = (byte[]) DataWrapper.getInstance().getData(imageDataKey));
【讨论】: