2015-06-14 148 views
2

嘗試搜索此問題,但無法找到它(可能是由於我對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); 
} 

回答

2

這是不可能的。 ImgurService.getImage(...)方法是異步的,你不能(不應該)同步等待它完成。相反,使用Callback<Image>來執行您想要在您的方法返回圖像時執行的代碼。

+0

在閱讀您的建議後,我可以使用更有針對性的關鍵字進行更多搜索(謝謝)。我在這裏找到一個例子:[鏈接](https://github.com/square/retrofit/issues/235) 我將用新代碼更新我的問題,並考慮這個答案。謝謝! – DemonCode

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()); 
     } 
    }); 
} 
+0

我相信我的解決方案是這樣的,但只需使用Retrofit附帶的Callback界面即可。查看對nhaarman的回覆。謝謝! – DemonCode