gpt4 book ai didi

android - Parcelable 中的标志有什么用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:42 26 4
gpt4 key购买 nike

我一直在将 Parcelable 写入 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);
}
}
}

这是我编写的 Map to/from Parcelable 实用程序,我想知道是否应按原样传递标志KeyValue 在写入它们时,或者应该为 Key 传递 0,为 传递 flags值(value)

我阅读了 docs 中标志的定义:

PARCELABLE_WRITE_RETURN_VALUE

added in API level 1

int PARCELABLE_WRITE_RETURN_VALUE

Flag for use with writeToParcel(Parcel, int): the object being written is a return value, that is the result of a function such as "Parcelable someFunction()", "void someFunction(out Parcelable)", or "void someFunction(inout Parcelable)". Some implementations may want to release resources at this point.

Constant Value: 1 (0x00000001)

但是我无法理解它。谁能用简单的术语解释什么是 Parcelable 标志以及应该如何使用它?

最佳答案

当前唯一存在的标志 (PARCELABLE_WRITE_RETURN_VALUE) 旨在用于 AIDL接口(interface)。它应该暗示某些类型的 Parcelable 对象,它们正在从 IPC 方法返回,因此可以释放它们的关联资源。 Fot 实例,ContentProvider 内部包含这样的 AIDL 方法:

ParcelFileDescriptor openFile(String path, int flags);

当您在自定义 ContentProvider 中重写 openFile 时,您的方法返回一个 open ParcelFileDescriptor...您不会自己关闭它,并且在进程间传输期间它不会自动关闭要么(在进程之间传递描述符并不意味着在 Linux 中关闭它们)。但是描述符并没有泄露!取而代之的是 ParcelFileDescriptor closes itself写入包裹时:

@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);
}
}
}

由于 ParcelFileDescriptor 只是普通的类,使用 Binder/Parcel 的工具在进程之间传递 FileDescriptor,你可以想象存在类似的类,它们持有本地资源(内存、文件描述符)并在从 openFile 返回时有条件地释放它们-喜欢的方法。

同样,其他标志可以用于将类似的条件行为深入传播到 Parcelable matryoshka。不幸的是,Android 开发者还没有为引入这样的自定义标志定义合理的规则(不像 IBinder#FIRST_CALL_TRANSACTIONIBinder#LAST_CALL_TRANSACTION),并且 AIDL 并没有在外部实践中广泛使用Android 内部结构,因此我不知道此类标志的任何示例。

关于android - Parcelable 中的标志有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44203223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com