Retrofit (Android) - 获取回调返回的对象
Retrofit (Android) - Getting An Object Returned From Callback
尝试搜索此问题,但找不到(可能是因为我对 Java/Retrofit 缺乏经验)。
我获得了 ImgurAPI 的实例 class 并调用 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;
}
我遇到的问题是确定一种正确的方法来将 return 在 success()
中编辑的图像返回到调用 ImgurAPI::getImage()
的 Activity。
最初我在 ImgurAPI 中有一个全局变量 Image image
,我会把它分配给检索到的图像,然后我会 return 那: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(...)
方法是异步的,您不能(不应该)同步等待它完成。相反,当您的方法 return 图像时,使用 Callback<Image>
来执行您想要执行的代码。
您需要使用回调模式,如果您不能直接从定义 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());
}
});
}
尝试搜索此问题,但找不到(可能是因为我对 Java/Retrofit 缺乏经验)。
我获得了 ImgurAPI 的实例 class 并调用 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;
}
我遇到的问题是确定一种正确的方法来将 return 在 success()
中编辑的图像返回到调用 ImgurAPI::getImage()
的 Activity。
最初我在 ImgurAPI 中有一个全局变量 Image image
,我会把它分配给检索到的图像,然后我会 return 那: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(...)
方法是异步的,您不能(不应该)同步等待它完成。相反,当您的方法 return 图像时,使用 Callback<Image>
来执行您想要执行的代码。
您需要使用回调模式,如果您不能直接从定义 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());
}
});
}