如何将改造的回调从活动转移到班级

时间:2015-05-10 06:42:29

标签: java android retrofit

我曾经在Activity中创建了createBottomBar()。由于Activity传递了4-5百行,我将它移动到一个单独的类,但现在我不知道如何访问我的updateMap()。

updateMap代码是:

private void updateMap(String path) {
    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(API_URL)
            .build();

    MyService service = restAdapter.create(MyService.class);
    service.points(path, context);                
}

界面在哪里:

public interface MyService {
@GET("/{point}")
void points(@Path("point") String path, MainActivity cb);
}

我应该在哪里/如何移动/更改改造的回调以便我能继续工作?

PS:我知道这不仅仅是一个java问题,而是一个Android。

1 个答案:

答案 0 :(得分:2)

用于回调的类必须实现Callback<T>接口。请参阅此处了解更多信息Retrofit doc 所以Callback不依赖于Activity类,而是依赖于回调接口的实现。因此,您可以将updateMap()方法放在任何您喜欢的类中,因为它不依赖于上下文。请参阅下面的简短示例

所以你的界面看起来像这样

public interface MyService {
    @GET("/{point}")
    void points(@Path("point") String path, Callback<YourClassType>);
}

您可以在匿名类

中内联定义回调实现
MyService service = restAdapter.create(MyService.class);

service.points(path, new Callback<YourClassType>)() {
    @Override
    public void success(YourClassType foo, Response response)
    {
        // success
    }

    @Override
    public void failure(RetrofitError error) {
        // something went wrong
    }
});                

希望这可以解决您的问题吗?

编辑:还请注意,每次要执行请求时都不必重新创建Rest Client。这样做就足够了。 因此,可以为restclient定义一个类对象并重用它。

public class MyRestClientClass{
    //class context
    MyService mService;

    //helper method for service instantiation. call this method once
    void initializeRestClient()
    {
        RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(API_URL)
            .build();
        mService = restAdapter.create(MyService.class);
    }

    //your service request method
    void updateMap()
    {
        mService.points(....)
    }
}

要使用此类,例如在下面的活动中是一个简短的虚拟代码

MyRestClientClass mRestClientClass = new MyRestClientClass();

//instantiate the rest client inside
mRestClientClass.initializeRestClient();

//to call your updateMap for example after a button click 
yourButton.setOnClickListener(new OnClickListener() {
    //note that this works the same way as the Retrofit callback
    public void onClick(View v) {
        //call your web service
        mRestClientClass.updateMethod();
    }
});