我有以下代码。
如您所见,该方法postTestResults应返回一个布尔值。
现在的问题是,在postTestResults我创建一个内部类之后AsyncHttpResponseHandler,我重写onSuccess并onFailure获取了AsyncHttpResponseHandler的结果。
但是如果我将return true放入onSuccess,onFailure显然它是行不通的,因为onSuccess并且onFailure必须返回void。
请问我如何应对这种情况?
public static Boolean postTestResults(DBManager db, String mDeviceId,
String mFirmwareVer, String mJobNo, int mTestType, Activity activity) {
MyRestClient.post(possibleEmail, device, results, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
return true; // does not work!
}
@Override
public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
// TODO Auto-generated method stub
}
});
return null;
}
Run Code Online (Sandbox Code Playgroud)

谢谢
致电后MyRestClient.post,仍然没有可用信息。在将来的某个时间,将调用onSuccess或onFailure。此异步行为是有意的,否则您将不得不等待通信故障。
不要返回任何东西,或者可能是正确的。并以完全不同的方式进行处理,通过调用onSuccess / onFailure中的内容来处理逻辑。
您可以通过以下方式强制等待结果(绝对可怕):
final Semaphore semaphore = new Semaphore(0);
final AtomicBoolean succeeded = new AtomicBoolean();
MyRestClient.post(possibleEmail, device, results, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
succeeded.set(true);
semaphore.release();
}
@Override
public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
succeeded.set(false);
semaphore.release();
}
});
semaphore.aquire();
return succeeded.get();
Run Code Online (Sandbox Code Playgroud)
调用发布后,信号量将停止当前线程的执行(因为其构造函数中的许可为0)。完成回调(onSuccess / onFailure)后,将设置结果(成功)。
局部变量必须(有效地)是最终变量,因此它们的对象不会更改。这是因为回调位于另一个线程中,并且回调中引用的对象是实际副本。因此,对于理解必须是最终的。但是必须将结果写入,因此必须使用值持有者最终对象的内部状态。因此,final boolean不能写入AtomicBoolean 。
顺便说一句,Boolean如果对象包装器(Boolean.TRUE,FALSE或null)boolean看起来更合适。