使用线程等待来自服务的消息

时间:2014-07-10 17:11:24

标签: android multithreading thread-safety handler

我有一个绑定服务,我发送消息,然后发回消息。所有这些都发生在另一个类中,称为 DataItems

主要活动使用此方法调用DataItems:

DataItems.getItems();

DataItems将向请求项目的服务发送消息,当它收到消息时(通过处理程序,它应该将其发送回调用活动)。

Items results = null;

public Items getItems() {
    sendMessage(); // sends a message to service;
    boolean messageNotReceived = true;
    --> while(messageNotReceived); // wait for message to come back;
    return results;
}


private class CustomHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
            results = msg.getData().getParcelable("items");
            messageNotReceived = true;
    }
}

问题是 while循环会阻塞线程,直到while循环完成后,才会调用handleMessage方法。我认为其中一个必须在一个单独的线程中运行,以便保持另一个未被阻止。

如果我在一个单独的线程中运行getItems(),它将如何将结果返回给调用活动?

getItems() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            while(messageNotReceived);
            // how to return value from here???
        }
    }
    // any operation here will continue in parallel with the thread
    // so any return statements here will be returned to the activity.
}

所以问题是如何在不阻塞整个执行线程的情况下等待来自Service的消息?

2 个答案:

答案 0 :(得分:2)

在这种情况下,我建议您在BroadcastReceiver中使用Activity。完成handleMessage后,将Broadcast发送到Activity,然后拨打DataItems.getItems();

答案 1 :(得分:0)

考虑在handleMessage()方法中添加一个案例,检查您收到的邮件类型。例如:

@Override
public void handleMessage(Message msg) {
        if (msg.getData().getString("sender", "").equals("senderA") {
              // Handle message of type A
        }
        else if (msg.getData().getString("sender", "").equals("senderB") {
              // Handle message of type b
        }
        // ...
}

这样,您的DataItems线程不必在等待响应时连续运行。它将在恰当的时间通过消息启动。