我有一个绑定服务,我发送消息,然后发回消息。所有这些都发生在另一个类中,称为 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的消息?
答案 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线程不必在等待响应时连续运行。它将在恰当的时间通过消息启动。