Retrofit(Android) - 获取回调对象返回

问题描述:

尝试搜索此问题,但无法找到它(可能是由于我对Java/Retrofit的经验不足)。Retrofit(Android) - 获取回调对象返回

我得到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有一个全局变量,我将它分配给检索到的图像,然后我会返回: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); 
} 

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

+0

在阅读您的建议后,我可以使用更有针对性的关键字进行更多搜索(谢谢)。我在这里找到一个例子:[链接](https://github.com/square/retrofit/issues/235) 我将用新代码更新我的问题,并考虑这个答案。谢谢! – DemonCode

您需要使用回调模式,如果您无法直接使用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()); 
     } 
    }); 
} 
+0

我相信我的解决方案是这样的,但只需使用Retrofit附带的Callback界面即可。查看对nhaarman的回复。谢谢! – DemonCode