Retrofit(Android) - 从回调中返回一个对象

时间:2015-06-14 19:35:46

标签: java android retrofit

尝试搜索这个问题,但找不到它(可能是由于我对Java / Retrofit缺乏经验)。

我得到了ImgurAPI类的一个实例,并调用ImgurAPI::getImage()

ImgurAPI imgurAPI = ImgurAPI.getInstance();
Image image = ImgurAPI.getImage(someIDHere);

我发出了获取图片的请求,并得到回复:

public Image getImage(final String id) {
    Image requestedImage = null;

    imgurService.getImage(id, new Callback<Image>() {
        @Override
        public void success(Image image, Response response) {
            //I need to get requestedImage = image to return
        }

        @Override
        public void failure(RetrofitError error) {
            System.out.println("Failed: " + error.toString());
        }
    });
    return requestedImage;
}

我遇到的问题是确定一种正确的方法,将success()中返回的图片恢复回调用ImgurAPI::getImage()的活动。

最初我在ImgurAPI Image image中有一个全局变量,我会将其分配给检索到的Image,然后我会返回:return ImgurAPI.image;。它有效,但感觉不正确。

是否有人建议这样做?或者我是以错误的方式解决这个问题?

使用解决方案进行编辑

在得到几个答案之后,我能够做更多的搜索,并发现这可以解决我的问题:

ImgurAPI imgurAPI = ImgurAPI.getInstance();
imgurAPI.getImage("OhERyMa", new Callback<Image>() {
    @Override
    public void success(Image image, Response response) {
        // Simple test to check for functionality
        Context context = getApplicationContext();
        String link = image.getData().getLink();
        LinearLayout ll = (LinearLayout)findViewById(R.id.imageScrollerLayout);
        ImageView iv = new ImageView(context);
        Picasso.with(context).load(link).into(iv);
        ll.addView(iv);
    }

    @Override
    public void failure(RetrofitError error) {
        System.out.println(error.toString());
    }
});

ImgurAPI::getImage()现在包含:

public void getImage(final String id, Callback<Image> callback) {
    imgurService.getImage(id, callback);
}

2 个答案:

答案 0 :(得分:2)

这是不可能的。 ImgurService.getImage(...)方法是异步的,您不能(不应该)同步等待它完成。相反,当方法返回图像时,使用Callback<Image>执行您想要执行的代码。

答案 1 :(得分:0)

您需要使用回调模式,如果您无法直接使用定义了getImage的结果,则可以将回调传递给方法来处理结果。

public interface ImageLoadedCallback { 
    void onImageLoaded(Image image);
}

public void getImage(final String id, final ImageLoadedCallback callback) {
    Image requestedImage = null;

    imgurService.getImage(id, new Callback<Image>() {
        @Override
        public void success(Image image, Response response) {
           callback.onImageLoaded(image);
        }

        @Override
        public void failure(RetrofitError error) {
            System.out.println("Failed: " + error.toString());
        }
    });
}