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

Android 使用线程等待来自服务的消息,android,multithreading,thread-safety,handler,Android,Multithreading,Thread Safety,Handler,我有一个绑定服务,我将消息发送给它,它将消息发送回。所有这些都发生在一个不同的类中,称为DataItems 主活动使用以下方法调用数据项: DataItems.getItems(); DataItems将向请求项的服务发送一条消息,当它收到返回的消息时(通过处理程序,它应该将消息发送回调用活动) 问题是while循环将阻塞线程,并且在while循环完成之前,不会调用handleMessage方法。我认为其中一个必须在单独的线程中运行,以保持另一个线程的畅通 如果在单独的线程中运行getItem

我有一个绑定服务,我将消息发送给它,它将消息发送回。所有这些都发生在一个不同的类中,称为DataItems

主活动使用以下方法调用数据项:

DataItems.getItems();
DataItems将向请求项的服务发送一条消息,当它收到返回的消息时(通过处理程序,它应该将消息发送回调用活动)

问题是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.
}

因此,问题是如何在不阻塞整个执行线程的情况下等待来自服务的消息?

考虑在
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线程就不必在等待响应时连续运行。相反,它将在正确的时间由一条消息启动。

在这种情况下,我建议您在
活动中使用
BroadcastReceiver
。每当
handleMessage
完成时,将
Broadcast
发送到您的
Activity
,然后您可以调用
DataItems.getItems()

在获取消息的处理程序中返回消息后,为什么不执行需要执行的操作?因为不同消息的情况不同。它位于库模块中,因此我需要将数据传递给活动,而不是将所有案例都放在handleMessage中,这在这里是不可能的。正如您所知,onPostExecute()将在完成doInBackground()后执行。这如何将数据返回到调用data.getItems()的活动?我想您建议我在每个活动中实现一个处理程序来处理消息。我正避免这样做,因为处理程序部分在库中的活动之外。@kicker86我明白了,我似乎误解了你的问题,因为我问的是如何在服务完成运行时通知数据项。在这种情况下,我建议消除while循环,并按照翠鸟的建议执行以下操作:
void getItems(){sendmages();}
(无需返回)和在
handleMessage(){//Send broadcast…}
@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
        }
        // ...
}