我有以下代码。
如您所见,方法postTestResults
应该返回一个 boolean 值。
现在的问题是,在postTestResults
中,我创建了一个内部类AsyncHttpResponseHandler
,并重写了onSuccess
和onFailure
以获取AsyncHttpResponseHandler的结果。
但是如果我在onSuccess
和onFailure
中将返回true 显然是行不通的,因为onSuccess
和onFailure
必须返回无效。
请问如何应对这种情况?
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;
}
谢谢
最佳答案
调用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();
调用发布后,信号量将停止当前线程的执行(因为其构造函数中的许可为0)。回调完成后(onSuccess/onFailure),将设置结果(成功)。
局部变量必须(有效)是最终变量,因此它们的对象不会更改。这是因为回调位于另一个线程中,并且回调中引用的对象是实际副本。因此,对于理解必须是最终的。但是必须将结果写入,因此必须使用值持有者最终对象的内部状态。因此,不能将AtomicBoolean作为
final boolean
写入。顺便说一句,如果对象包装器(Boolean.TRUE,FALSE或null)作为结果,
Boolean
似乎更合适。