Din*_*101 5 java android parcel android-binder
我必须和IBinders 和Parcels 一起工作。我已经浏览了所有IBinder、Binder和Parcel文档,但找不到任何关于何时调用的内容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并将其传递到线程池内的任务中。但因为我不知道包裹何时(或是否)被回收,所以我不知道何时(或是否)可以使用数据包裹。
在每个例子中,我都没有看到这个
这是预期的。的调用者有责任onTransact()回收其Parcel. 毕竟,onTransact()不知道调用者是否打算重用该Parcel实例。
这是否意味着调用recycle将回收连接两端的包裹?
据我所知,不。
或者当 onTransact 方法退出时,数据和回复包(在 onTransact 方法中)只是在幕后回收。
是的。
如果有人确实有答案,你是从哪里找到的?
我看了一下源代码Binder,onTransact()是在哪里调用的。该finally块回收Parcel实例。
理想情况下,我想做的是从 onTransact 获取数据包并将其传递到线程池内的任务中。但因为我不知道包裹何时(或是否)被回收,所以我不知道何时(或是否)可以使用数据包裹。
由于Parcel是回收的,所以不安全。您需要从中获取数据Parcel并将其放入线程池中的其他内容中。