何时调用 Parcel.recycle()?

Din*_*101 5 java android parcel android-binder

我必须和IBinders 和Parcels 一起工作。我已经浏览了所有IBinderBinderParcel文档,但找不到任何关于何时调用的内容Parcel.recycle(我也从未读过任何说 aparcel必须被回收的内容)。我见过类似下面的例子:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

但令我困惑的是,在每个例子中,我都没有看到这一点:

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
    }

  }
}
Run Code Online (Sandbox Code Playgroud)

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

如果有人确实有答案,你是从哪里找到的?是否有某种秘密书籍或网站记录了这一点?我在https://developer.android.com上找不到它

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

Com*_*are 0

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

这是预期的。的调用者有责任onTransact()回收其Parcel. 毕竟,onTransact()不知道调用者是否打算重用该Parcel实例。

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

据我所知,不。

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

是的。

如果有人确实有答案,你是从哪里找到的?

我看了一下源代码BinderonTransact()是在哪里调用的。该finally块回收Parcel实例。

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

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