【问题标题】:Asynchronous within non-void method非 void 方法中的异步
【发布时间】:2015-08-16 07:39:35
【问题描述】:

我正在使用 Android loopj 库来拥有异步 HTTP 客户端。我需要将responseBody 设置为图像对象的属性,如下所示,但由于异步,将运行返回语句并且图像对象始终为空。

 public Image uploadImage(boolean async) {
        Image image = new Image();

        HttpClient.post(getFinalUrl(async), makeRequestParams(), new AsyncHttpResponseHandler
                () {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                UploadResponse[] uploadResponses = GsonParser.getArrayFromGson(responseBody,
                        UploadResponse[].class);
                UploadResponse response = uploadResponses[0];
                String st = response.getContent();
                image.setImageAddress(st);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Log.d("injaro", error.getMessage());
            }
        });


    }

【问题讨论】:

    标签: android asynchronous loopj


    【解决方案1】:

    异步方法不能以这种方式工作。您应该向他们传递一个回调对象,一旦响应可用,就会调用该对象。

    所以如果你像这样定义一个回调接口:

    public interface ImageCallback {
       void onImageReceived(Image image);
    }
    

    然后您可以像这样创建 2 个方法(一个同步和一个异步):

    public Image uploadImage() {
    ...
    }
    
    public void uploadImageAsync(ImageCallback callback) {
    ...
    }
    

    此时您只需要调用您需要的方法 - 即在按钮单击侦听器上会调用异步方法(因为您不想阻塞 UI 线程),但您的后台服务可以安全地调用同步的。

    【讨论】:

    • 你救了我,教会了我新的东西,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    相关资源
    最近更新 更多