首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时调用Parcel.recycle()?

何时调用Parcel.recycle()?
EN

Stack Overflow用户
提问于 2022-05-02 00:45:56
回答 1查看 128关注 0票数 5

我必须使用IBinders和Parcels。我已经阅读了所有的IBinder粘结剂包裹文档,并且找不到任何关于何时调用Parcel.recycle的信息(我也从未读过任何关于必须回收parcel的内容)。我见过以下例子:

代码语言:javascript
复制
void someMethod(IBinder binder) {
  final int code = // ...
  final Parcel data = Parcel.obtain()
  final Parcel reply = Parcel.obtain()

  try {
    binder.transact(code, data, reply, 0);
  } finally {
    data.recycle();
    reply.recycle();
  }
}

但让我困惑的是,在每一个例子中,我做的都是,而不是

代码语言:javascript
复制
class MyBinder extends Binder {
  @Override
  public boolean onTransact(int code, Parcel data, Parcel reply, int flags) {

    try {
      // do things...
    } finally {
      data.recycle();
      // calling reply.recycle() doesn't make sense because it has to be sent
      // back to the client
    }

  }
}

这是否意味着调用recycle将回收连接两端的包裹?或者,当onTransact方法退出时,数据和回复包(在onTransact方法中)只是在幕后循环。

如果有人知道答案,你从哪里找到的?有没有什么秘密的书或网站来记录这个?我在https://developer.android.com上找不到它

理想情况下,我想做的是从onTransact获取数据包,并将其传递到线程池内的任务中。但因为我不知道包裹何时(或是否)被回收,我不知道何时(或是否)我可以使用数据包裹。

EN

回答 1

Stack Overflow用户

发布于 2022-07-10 11:26:07

在每一个例子中,我都没有看到

这是意料之中的。onTransact()的调用方有责任回收其Parcel。毕竟,onTransact()不知道调用方是否打算重用该Parcel实例。

这是否意味着调用回收站将回收连接两端的包裹?

AFAIK,不。

或者,当onTransact方法退出时,数据和回复包(在onTransact方法中)只是在幕后循环。

是。

如果有人知道答案,你从哪里找到的?

我查看了Binder的源代码,其中有正在被召唤finally块回收Parcel实例。

理想情况下,我想做的是从onTransact获取数据包,并将其传递到线程池内的任务中。但因为我不知道包裹何时(或是否)被回收,我不知道何时(或是否)我可以使用数据包裹。

由于Parcel是回收的,这是不安全的。您将希望从Parcel中获取数据,并将其放入线程池中的其他内容中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72081421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档