Android - sendBroadcast()和onReceive() - 进程间通信的同步解决方案

时间:2012-01-27 09:27:41

标签: android asynchronous android-intent broadcastreceiver synchronous

我想建立一个能够以同步方式(从客户端)发送/接收内容的库。所以我的图书馆的客户不必关心实现接收器。

图书馆会在某处发送意图并收到回复。然后它会同步将结果返回给客户端。

用例是使用意图在我自己的应用程序之间传输一些数据。通常我会异步使用意图和接收器(因为它们应该工作),但这是规则的例外。

建议的解决方案(简化!)。库:

public class Helper {
private Context context;
private BroadcastReceiver tempReceiver;
private int result = 0;

int getResult() {

    tempReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Helper.this.result = 1;
        }
    };
    context.registerReceiver(tempReceiver);
    context.sendBroadcast(/* ask for smth */);

    Thread.sleep(5000);

    context.unregisterReceiver(tempReceiver);
    return result; 
}
}

客户端是一个想要从库中获取一些数据的应用程序,如:

int timeout = 5000;
Helper lib = new Helper(timeout);
lib.getData();

你怎么看?有哪些威胁?我知道调用getReturn()会阻塞,无法在GUI线程中调用。睡眠解决方案是否可接受的问题。

3 个答案:

答案 0 :(得分:2)

我认为你已经意识到标准的同步与异步权衡,以及它们是有利的而不是这样的情况。

IMO,只有广播也由您自己的应用程序发送,您的方法才可以。如果您对系统广播感兴趣,那么5秒延迟可能在可接受和灾难性之间变化。想象一下,注册“拍照”广播,然后5秒钟后,当用户拍摄另一张照片时,您的同步通话会返回并显示一些内容,从而使用户感到厌烦。

另外,您如何建议处理广播不是一次性而非连续性的情况?

我曾试图在封面下使用AsyncTask设计API;并以同步方式公开它。但事实证明,使用此API会使客户端代码更加混乱。我的结论是,某些事情并不意味着要同步完成;并继续采用基于回调的异步方法。我想说的是,广播并不意味着同步。

只需2美分。

答案 1 :(得分:1)

我不明白你正在努力实现的目标 谁是广播公司?谁是接收者?更好地描述库和客户端代码之间的通信将是有帮助的。

无论如何广播都是异步的(sendBroadcast)。接收器将在UI线程上调用,它在同步的位置。但它并不保证什么时候会被调用。 android系统会尽快完成。

通过睡眠接缝进行同步,例如一个非常错误的设计决定,而不是应该使用什么广播。

如果你需要一个同步回调我会推荐听众模式,就像android一样:例如: onClick接口。

答案 2 :(得分:0)

基础知识! - 同步

<canvas width="500" height="300" id="canvas">Sorry, no canvas available</canvas>
<a id="download">Download as image</a>