当前位置: 首页 > 知识库问答 >
问题:

parcelable中的标志有什么用?

牛骞仕
2023-03-14

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

这是我编写的一个mapparcelable实用程序/从parcelable到/从parcelable实用程序,我想知道在编写它们时,是否应该将标志按原样传递给Key和Value,或者应该为Key传递0,而为Value传递flags

我在文档中读到了什么是标志的定义:

PARCELABLE_WRITE_RETURN_VALUE

在API级别1中添加

int PARCELABLE_WRITE_RETURN_VALUE

writeToparcel(Parcel,int)一起使用的标志:正在写入的对象是一个返回值,它是“Parcelable someFunction()”、“void someFunction(out Parcelable)”或“void someFunction(inout Parcelable)”等函数的结果。某些实现可能希望在此时释放资源。

常量值:1(0x00000001)

共有1个答案

濮波
2023-03-14

当前唯一存在的标志(parcelable_write_return_value)用于AIDL接口。它应该提示某些类型的可打包对象,它们正在从IPC方法返回,因此可以释放它们的相关资源。Fot实例,ContentProvider内部包含如下所示的AIDL方法:

ParcelFileDescriptor openFile(String path, int flags);

当您在自定义ContentProvider中重写OpenFile时,您的方法将返回一个打开的ParcelFileDescriptor……您自己不会关闭它,在进程间传输过程中也不会自动关闭它(在Linux中进程间传递描述符并不意味着关闭它们)。但是描述符没有泄露!相反,ParcelFileDescriptor在写入parcel时关闭自身:

@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的方法返回时有条件地释放它们。

同样,其他标志也可以用来向可打包的matryoshka下传播类似的条件行为。不幸的是,Android开发人员还没有为引入此类自定义标志定义合理的规则(与IBinder#first_call_transactionIBinder#last_call_transaction)不同,而且AIDL在Android内部之外的实践中没有广泛使用,因此我不知道此类标志的任何示例。

 类似资料:
  • 问题内容: public static final Parcelable.Creator CREATOR = new Parcelable.Creator () { public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in); } 在我的Android课程中,讲师使用了这段代码,他们并没有对此做充分的解

  • 的函数签名提供了以下选项: 我找不到<code>low_memory标志的任何文档。我不知道这些功能是否已经实现,如果是,它们是如何工作的。 具体来说, :如果实现,它是否使用,如果是,它会将单个列存储为memmap或行 :它是否指定了类似的东西来存储在内存中 我们可以将现有的<code>数据帧 附言:相关模块的版本

  • 问题内容: 我正在跟踪在使用时使用该标志的示例,但无法通过帮助系统弄清楚该标志在做什么。 问题答案: 告诉您安装命名模块,以便全局访问它。 但是重要的是要了解它通常仅用于提供命令行实用程序的软件包,以便它们的可执行组件在系统中可用。 如果您有多个程序使用同一软件包,则每个程序都应在本地安装该软件包。如果您确实想通过全局安装来共享已安装的软件包,则还必须使用。 请参阅此处有关全局安装软件包主题的文档

  • 问题内容: HotSpot JVM标志有什么作用,什么时候应该使用它?在64位Java实例上使用它时(相对于未使用它),我会看到什么样的性能和内存使用差异? 问题答案: 默认情况下,去年的大多数HotSpot JVM均已启用它。此选项允许引用在64位JVM中为32位,并访问接近32 GB的堆。(可以使用32位以上的指针)(您也可以拥有几乎无限的堆外内存)。这样可以节省大量内存,并有可能提高性能。

  • 当使用gcc或Clang编译C源代码时,我总是使用标志来生成gdb的调试信息。 gcc-g-o helloworld. c 我注意到有些人推荐使用。和标志之间有什么区别?和之间也有区别吗?

  • 问题内容: 使用mysqli,我可以获得类似这样的字段的信息 我可以使用以下方法从结果中获取字段标志 PHP手册说,这将返回“一个表示该字段的位标志的整数”。但这就是我能找到的所有信息。如何解释位标志?到目前为止,我已经解决了 整数(字段长度无关紧要)根据指定的属性返回以下位标志: 谢谢你的尽心帮助! 问题答案: 参见http://www.php.net/manual/en/mysqli-resu