我必须使用IBinders和Parcels。我已经阅读了所有的IBinder、粘结剂和包裹文档,并且找不到任何关于何时调用Parcel.recycle的信息(我也从未读过任何关于必须回收parcel的内容)。我见过以下例子:
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();
}
}但让我困惑的是,在每一个例子中,我做的都是,而不是:
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获取数据包,并将其传递到线程池内的任务中。但因为我不知道包裹何时(或是否)被回收,我不知道何时(或是否)我可以使用数据包裹。
发布于 2022-07-10 11:26:07
在每一个例子中,我都没有看到
这是意料之中的。onTransact()的调用方有责任回收其Parcel。毕竟,onTransact()不知道调用方是否打算重用该Parcel实例。
这是否意味着调用回收站将回收连接两端的包裹?
AFAIK,不。
或者,当onTransact方法退出时,数据和回复包(在onTransact方法中)只是在幕后循环。
是。
如果有人知道答案,你从哪里找到的?
我查看了Binder的源代码,其中有正在被召唤。finally块回收Parcel实例。
理想情况下,我想做的是从onTransact获取数据包,并将其传递到线程池内的任务中。但因为我不知道包裹何时(或是否)被回收,我不知道何时(或是否)我可以使用数据包裹。
由于Parcel是回收的,这是不安全的。您将希望从Parcel中获取数据,并将其放入线程池中的其他内容中。
https://stackoverflow.com/questions/72081421
复制相似问题