代码之家  ›  专栏  ›  技术社区  ›  Alex

非空方法中的异步

  •  0
  • Alex  · 技术社区  · 10 年前

    我正在使用Android loopj 库具有异步HTTP客户端。我需要设置 responseBody 映像对象的属性如下,但由于异步,将运行return语句,而映像对象始终为空。

     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());
                }
            });
    
    
        }
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   Samuil Yanovski    10 年前

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

    因此,如果您像这样定义回调接口:

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

    然后可以创建两种方法(一种是同步的,一种是异步的),如下所示:

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

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

    推荐文章