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