pul*_*ion 12 flags android parcel parcelable
我一直在编写Parcelables而Parcel没有关注flags字段,这是方法签名中的一个参数,它工作正常,但我遇到了一个我不能再忽略它们的实现:
public static <K extends Parcelable, V extends Parcelable> void write(Parcel dest,
Map<K, V> map, int flags) {
if (map == null) {
dest.writeInt(-1);
} else {
Set<Map.Entry<K, V>> entrySet = map.entrySet();
dest.writeInt(entrySet.size());
for (Map.Entry<K, V> entry : entrySet) {
dest.writeParcelable(entry.getKey(), flags);
dest.writeParcelable(entry.getValue(), flags);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个Map 向/从 Parcelable程序我已经写了,我想知道如果标志应传递,因为它是两个关键还有价值,而写他们还是应该通过0 键和flags对值.
我阅读了文档中标志的定义:
PARCELABLE_WRITE_RETURN_VALUE
在API级别1中添加
Run Code Online (Sandbox Code Playgroud)int PARCELABLE_WRITE_RETURN_VALUE用于的标志
writeToParcel(Parcel, int):正在写入的对象是返回值,它是诸如"Parcelable someFunction()","void someFunction(out Parcelable)"或"void someFunction(inout Parcelable)"之类的函数的结果 .某些实现可能希望此时释放资源.常数值:1(0x00000001)
但我无法理解它.任何人都能用简单的语言解释一下Parcelable旗帜是什么以及它应该如何使用?
唯一当前存在的标志(PARCELABLE_WRITE_RETURN_VALUE)旨在用于AIDL接口.它应该暗示某些类型的Parcelable对象,它们是从IPC方法返回的,因此可以释放它们的相关资源.在Fot实例中,ContentProvider内部包含AIDL方法,如下所示:
ParcelFileDescriptor openFile(String path, int flags);
Run Code Online (Sandbox Code Playgroud)
当您openFile在自定义ContentProvider中重写时,您的方法返回一个打开的 ParcelFileDescriptor ...您不是自己关闭它,并且它在进程间传输期间也不会自动关闭(在进程之间传递描述符并不意味着在Linux中关闭它们).但描述符没有泄露!而是在写入Parcel时ParcelFileDescriptor自行关闭:
@Override
public void writeToParcel(Parcel out, int flags) {
if (mWrapped != null) {
try {
mWrapped.writeToParcel(out, flags);
} finally {
releaseResources();
}
} else {
if (mCommFd != null) {
out.writeInt(1);
out.writeFileDescriptor(mFd);
out.writeFileDescriptor(mCommFd);
} else {
out.writeInt(0);
out.writeFileDescriptor(mFd);
}
if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) {
// Not a real close, so emit no status
closeWithStatus(Status.SILENCE, null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于ParcelFileDescriptor只是普通类,使用Binder/Parcel的工具在进程之间传递FileDescriptor,您可以想象存在类似的类,它们保留在本机资源(内存,文件描述符)上,并在从类似openFile的方法返回时有条件地释放它们.
同样,其他标志可以被用来传播类似条件的行为深深下来Parcelable套娃.不幸的是,Android开发人员没有为引入这样的自定义标志定义合理的规则(不像eg IBinder#FIRST_CALL_TRANSACTION和IBinder#LAST_CALL_TRANSACTION),并且AIDL在Android内部的实践之外没有被广泛使用,所以我不知道这些标志的任何示例.
| 归档时间: |
|
| 查看次数: |
4038 次 |
| 最近记录: |