对服务进行异步调用(Android)

时间:2014-07-01 19:29:45

标签: android

现在我有一个活动和一个本地服务。我需要能够从活动中异步调用服务方法。我知道在服务和活动之间进行通信的唯一方法是通过Intent,绑定和AIDL。

我试过绑定,但绑定的服务调用是同步的。

使用意图(修改传递给startService的意图)也不起作用,因为在主线程上调用了onStartCommand。

我宁愿不诉诸AIDL,因为它似乎相当复杂。我缺少任何替代方案?

btw Making Asynchronous Service calls in Android没有回答我的问题

PROLOGUE

关注CommonWare's answer我决定使用一个带有ThreadPoolExecuter的服务

2 个答案:

答案 0 :(得分:0)

  

我知道在服务和活动之间进行通信的唯一方法是通过Intents,binding和AIDL。

AIDL 绑定。 AIDL可以在应用程序之间进行绑定。

  

我试过绑定,但绑定的服务调用是同步的。

然后在后台线程中进行调用。

  

使用意图(修改传递给startService的意图)不起作用,因为在主线程上调用onStartCommand。

然后,服务可以使用后台线程。例如,IntentService提供后台线程,将最初交付的Intent传递给onStartCommand()方法。

  

我缺少任何替代方案?

没有避免后台主题。

答案 1 :(得分:0)

事实证明,IntentService对我不起作用,因为我需要持久对象,并且在完成所有作业后关闭IntentServices。相反,我使用了一个Executor的服务,我在一个后台线程上运行我的所有服务请求。

handleMessageHelper处理后台线程上的所有请求。我使用Messenger来接收请求,并使用自定义Runnablemsg传递给我的handleMessageHelper方法

MyService.java(摘录)

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());