我有与通信的应用的Service
中使用的远程过程Messenger
接口。 这里的事情是如何设置的基本结构:
- 该应用程序生成需要访问服务的几个“操作”的对象。
- 每个“操作”包含一个
Handler
包在Messenger
用于从接收的响应数据回Service
- 当操作执行时,它包裹其
Messenger
成Intent
并调用startService()
将该消息传递到所述远程服务 - 远程服务执行基于所述的参数的一些工作
Intent
,然后返回通过发送所述响应Message
到Messenger
该操作。
这里存在于运行的基本代码:
public class SessionOperation {
/* ... */
public void runOperation() {
Intent serviceIntent = new Intent(SERVICE_ACTION);
/* Add some other extras specific to each operation */
serviceIntent.putExtra(Intent.EXTRA_EMAIL, replyMessenger);
context.startService(serviceIntent);
}
private Handler mAckHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
//Process the service's response
}
};
protected Messenger replyMessenger = new Messenger(mAckHandler);
}
和服务是如何构成的片段(这基本上是一个IntentService
不关机,当队列为空):
public class WorkService extends Service {
private ServiceHandler mServiceHandler;
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//If intent has a message, queue it up
Message msg = mServiceHandler.obtainMessage();
msg.obj = intent;
mServiceHandler.sendMessage(msg);
return START_STICKY;
}
private void onHandleIntent(Intent intent) {
Messenger replyTarget = intent.getParcelableExtra(Intent.EXTRA_EMAIL);
/* Do some work */
Message delivery = Message.obtain(...);
replyTarget.send(delivery);
}
}
这一切工作飞驰很好。 我可以从几个不同的应用程序发送万吨的操作相同的服务,他们都处理并发送其响应拿捏到位。 然而...
我注意到,如果应用程序运行足够长的时间,并有足够的活动,将有崩溃OutOfMemoryError
。 当看着MAT的HPROF数据,我注意到所有这些操作在内存故步自封的是,他们被挟持的,因为的垃圾收集器Messenger
。 显然, Messenger
实例被创建到活页夹一个长期的本地连接计数为GC根,这是保持每个“操作”对象在内存下去。
有谁知道,如果有一种方法来清除或禁用的Messenger
时,“操作”结束,因此不会产生此内存泄漏? 是否有可能实现IPC的另一种方式Service
以同样的方式,使多个不同的对象可以提出请求并异步得到的结果?
提前致谢!