使用处理程序进行改造调用

时间:2014-12-11 19:06:53

标签: android callback retrofit

我正在尝试使用改造创建一个处理程序来进行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)来实现这一点,但我不确定它是如何工作的,或者它是否是最好的方法。

那我怎么能实现呢?

2 个答案:

答案 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 +任何依赖注入器来缓解您的生活。