我正在尝试使用改造创建一个处理程序来进行api调用。 我的电话工作和我得到了答复,但我想知道返回答案的最佳做法是什么。
以下是我的代码的简化版本:
public class ApiHandler{
private static String username = "myUsername";
private static String sessionID = "mySessionID";
public static ObjectResponse getObjects(String id){
ClientApi.getApiClient().getObjects(new ObjectRequest(username, sessionID, id), new Callback<ObjectResponse>() {
@Override
public void success(ObjectResponse ObjectResponse, Response response) {
//Request succes
/*I would like to pass the ObjectResponse from the success method to the getObjects method to be able to return them*/
}
@Override
public void failure(RetrofitError error) {
//Request failure
///TODO
System.out.println(error.getResponse().getStatus());
}
});
//I would like to return the ObjectResponse here
return null;
}
}
然后我只是从我的片段中调用:myObjectResponse = ApiHandler.getObjects(id);
我的问题是,当在回调中调用success()方法时,getObject()方法已经结束,我无法返回响应。
我看到我可以使用eventbus(otto)来实现这一点,但我不确定它是如何工作的,或者它是否是最好的方法。
那我怎么能实现呢?
答案 0 :(得分:0)
我终于找到了答案。 使用otto我只需要将objectResponse发送到总线,如下所示:
public class ApiHandler{
private static String username = myUsername;
private static String sessionID = mySessionID;
public static ObjectResponse getObjects(String id){
ClientApi.getApiClient().getObjects(new ObjectRequest(username, sessionID, id), new Callback<ObjectResponse>() {
@Override
public void success(ObjectResponse objectResponse, Response response) {
//Request success
BusProvider.getInstance().post(objectResponse);
/*I would like to pass the ObjectResponse from the success method to the getObjects method to be able to return them*/
}
@Override
public void failure(RetrofitError error) {
//Request failure
///TODO
System.out.println(error.getResponse().getStatus());
}
});
//I would like to return the ObjectResponse here
return null;
}
}
然后在我的片段中,注册为接收者:
@Override
public void onPause(){
super.onPause();
//Unregister the fragment from the bus provider
BusProvider.getInstance().unregister(this);
}
@Override
public void onResume(){
super.onResume();
//Register the fragment to be able to receive events through the bus provider
BusProvider.getInstance().register(this);
}
@Subscribe
public void onObjectResponse(ObjectResponse objectResponse){
System.out.println("We did it!!!");
//Do what you want with your object!
}
答案 1 :(得分:0)
在EventBus之前,需要一个接口作为ApiHandler
类的私有成员(在您的情况下)。现在成功了,你可以调用你未实现的界面方法。
您可以在UI中的某个位置实现此方法,并调用getObject()
以在后台运行。一旦方法成功,它将触发您在UI中实现的界面方法以及objectResponse
来使用。
EventBus具有非常相似的概念,除了它是一个中心(或单数)并且以频道/订阅方式工作。尝试使用Eventbus + Retrofit +任何依赖注入器来缓解您的生活。