我有以下代码。

如您所见,方法postTestResults应该返回一个 boolean 值。

现在的问题是,在postTestResults中,我创建了一个内部类AsyncHttpResponseHandler,并重写了onSuccessonFailure以获取AsyncHttpResponseHandler的结果。

但是如果我在onSuccessonFailure中将返回true 显然是行不通的,因为onSuccessonFailure必须返回无效

请问如何应对这种情况?

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似乎更合适。

09-25 22:31