现在我有一个活动和一个本地服务。我需要能够从活动中异步调用服务方法。我知道在服务和活动之间进行通信的唯一方法是通过Intent,绑定和AIDL。
我试过绑定,但绑定的服务调用是同步的。
使用意图(修改传递给startService的意图)也不起作用,因为在主线程上调用了onStartCommand。
我宁愿不诉诸AIDL,因为它似乎相当复杂。我缺少任何替代方案?
btw Making Asynchronous Service calls in Android没有回答我的问题
PROLOGUE
关注CommonWare's answer我决定使用一个带有ThreadPoolExecuter的服务
答案 0 :(得分:0)
我知道在服务和活动之间进行通信的唯一方法是通过Intents,binding和AIDL。
AIDL 是绑定。 AIDL可以在应用程序之间进行绑定。
我试过绑定,但绑定的服务调用是同步的。
然后在后台线程中进行调用。
使用意图(修改传递给startService的意图)不起作用,因为在主线程上调用onStartCommand。
然后,服务可以使用后台线程。例如,IntentService
提供后台线程,将最初交付的Intent
传递给onStartCommand()
方法。
我缺少任何替代方案?
没有避免后台主题。
答案 1 :(得分:0)
事实证明,IntentService对我不起作用,因为我需要持久对象,并且在完成所有作业后关闭IntentServices。相反,我使用了一个Executor
的服务,我在一个后台线程上运行我的所有服务请求。
handleMessageHelper
处理后台线程上的所有请求。我使用Messenger
来接收请求,并使用自定义Runnable
将msg
传递给我的handleMessageHelper
方法
ExecutorService background = Executors.newSingleThreadExecutor();
//handles messages from client
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
background.execute(new MessengerRunnable(msg));
super.handleMessage(msg);
}
class MessengerRunnable implements Runnable {
public Message msg;
public MessengerRunnable(Message m) {
super();
msg = m;
}
@Override
public void run() {
handleMessageHelper(msg);
}
}
}
//called from handleMessage in IncomingHandler
//should be run on `background` ExecutorService
public void handleMessageHelper(Message msg) {
Log.d("CASE: ","" + msg.what);
switch (msg.what) {
case SET_ACCOUNT:
Bundle b = msg.getData();
String accountName = b.getString("accountName");
if (accountName != null) {
setAccount(accountName);
}
break;
}
}
final Messenger mMessenger = new Messenger(new IncomingHandler());