0

我想编写一个连接到远程服务的模块。

开发人员可以在他们的应用程序中使用该模块连接到特定的(蓝牙)硬件。然后它应该连接到一个可以在市场上单独更新的远程服务。

因为远程服务只允许同时使用它的所有应用程序有一个线程(只有一个蓝牙连接),所以我选择了信使方法而不是 AIDL。

我现在的问题是我想在我的公共 API 中提供一个同步方法,但服务在处理程序中返回 - 据我所知,处理程序将一直等待当前任务完成......所以有没有在不同的线程中获得答案的方法?

我希望它是同步方法的代码:

responseDataSync = new Sync<ResponseData>();

    // Send message
    Message msg = Message.obtain(null, Constants.DATA, 1, 0);

    send(msg);

    try {
        ResponseData responseData = responseDataSync.get();

        // with responseDataSync using a countdown latch to synchronize...
// but it never fires thanks to the handler.
//etc...

提前致谢。我希望我的问题有点可以理解...... ;)

/编辑:我想要一些从服务器返回数据的方法。喜欢

 public ResponseData returnResponse(Data dataToSend)

但我等不及服务的返回,因为我被困在阻止处理程序返回的线程中......

4

1 回答 1

3

AHandler与单个消息队列相关联。如果您Message从任何线程发送一个,它将在那里排队。

接收所有消息的线程将从队列中取出适当的消息并一一处理。

对您而言,这意味着如果您有一个处理程序并且您通过处理程序运行所有消息,则您不需要同步,因为所有内容都在单个线程中处理。

编辑:创建一个处理后台线程中消息的处理程序:

HandlerThread ht = new HandlerThread("threadName");
ht.start();
Looper looper = ht.getLooper();
Handler.Callback callback = new Handler.Callback() {

    @Override
    public boolean handleMessage(Message msg) {
        // handled messages are handled in background thread 
        return true;
    }
};
Handler handler = new Handler(looper, callback);

handler.sendEmptyMessage(1337);

Edit2:等待消息可能会像这样工作

// available for all threads somehow
final Object waitOnMe = new Object();

HandlerThread ht = new HandlerThread("threadName");
ht.start();
Looper looper = ht.getLooper();
Handler.Callback callback = new Handler.Callback() {

    @Override
    public boolean handleMessage(Message msg) {
        // handled messages are handled in background thread
        // then notify about finished message.
        synchronized (waitOnMe) {
            waitOnMe.notifyAll();
        }
        return true;
    }
};
Handler handler = new Handler(looper, callback);

// in a different Thread:
synchronized (waitOnMe) {
    handler.sendEmptyMessage(1337);
    try {
        waitOnMe.wait();
    } catch (InterruptedException e) {
        // we should have gotten our answer now.
    }
}
于 2012-04-20T09:46:30.393 回答