Android / Java在返回Service内部之前等待处理程序

时间:2013-09-24 02:16:14

标签: java android service concurrency handler

我需要使用现有的API,假定它将直接在Activity中的简单应用程序中使用。我的用例需要从服务中调用API并等待所需的Handler返回所需的数据。

我尝试了许多Java Concurrency选项但没有成功。任何人都可以提出更好的方法吗?

下面是一个极其简化的示例,它比工作示例更具伪代码。

public class dataConnection {

Controlx xControl;
CountDownLatch doneSignal = new CountDownLatch(1);
Context c = null;

private String data1;

Handler mHandler = new Handler() { 
    @Override
    public void handleMessage(Message msg) {
        setReturnData(msg);
        doneSignal.countDown();
    }
};

public dataConnection(Context ctx) { 
    this.c = ctx;
    xControl = new Controlx (c, mHandler);
}       

private void setReturnData(int rc) {
    this.rc = rc;
}

private int getReturnData() {
    return this.rc;
}

public int getRealData() {

    //API will timeout in 10 seconds if data is not retrieved before that
        xControl.dataCmd(10);

    //Wait here for handler to finish and then retrieve data to return
    doneSignal.await(); 

    int i = getReturnData();

    Log.v("log_tag", "RETURN NOW!!!!!!!!!!!!!!!");
    return data;
}

1 个答案:

答案 0 :(得分:0)

如果Handler使用与getRealData()方法相同的主题,则会阻止它看到MessageLooper必须完成一件事才能处理任何新事物。

如果为处理程序创建一个新线程和looper,它将允许它们分别运行。根据您的需要,Future<Integer>对象也可能有用。

Looper | Android Developers

Future | Android Developers