我有以下代码。
如您所见,方法postTestResults
应该返回一个布尔值。
现在的问题是在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;
}
由于
答案 0 :(得分:4)
致电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),结果被设置(成功)。
局部变量必须(有效)最终,因此它们的对象不会改变。这是因为回调在另一个线程中,并且回调中引用的对象是实际的副本。所以要理解必须是最终的。但是必须写入结果,因此必须使用值保持器,最终对象的内部状态。因此,无法将final boolean
写成AtomicBoolean。
顺便说一下,如果对象包装器(Boolean.TRUE,FALSE或null),Boolean
似乎更合适,那么boolean
就是结果。
答案 1 :(得分:3)
在您的代码示例中,您使用的是匿名类而不是内部。
Annonymous类与常规类没有区别。它是一个语法糖,允许您实现接口(不声明类名称,javac将为您执行此操作)。
在您的情况下,您应该通过中断代码的执行来抛出方法onFailure
中的异常。
因为您处理异步调用,所以您不知道何时执行代码。因此,应该从方法onSuccess
调用您要成功执行的任务,或者应用程序应该在某个地方等待回调的结果。
答案 2 :(得分:2)
您可以添加如下系统:
public class MyAsync extends AsyncHttpResponseHandler{
private final MyAsyncState state;
public MyAsync(MyAsyncState state){
this.state = state;
}
public void onSuccess(......){
this.state.setResult(true);
}
public void onFailure(.....){
this.state.setResult(false);
}
}
MyAsyncState类:
public class MyAsyncState{
private Boolean state;
public void setResult(boolean b){
this.state = b;
doIt();
}
private void doIt(){
// do what you want
// show popup for example
}
}