我需要使用现有的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;
}
答案 0 :(得分:0)
如果Handler
使用与getRealData()
方法相同的主题,则会阻止它看到Message
。 Looper
必须完成一件事才能处理任何新事物。
如果为处理程序创建一个新线程和looper,它将允许它们分别运行。根据您的需要,Future<Integer>
对象也可能有用。