【问题标题】:Using retrofit & dagger how would I create an app where I can easily switch out end points?使用改造和匕首,我将如何创建一个可以轻松切换端点的应用程序?
【发布时间】:2015-08-26 22:05:02
【问题描述】:

目前我这样做的方式是我有一个如下所示的 ApiConfig 类:

public class ApiConfig {

public enum Build{
    RELEASE("https://api.endpoint.com"),
    STAGE("http://api.stage.endpoint.com"),
    DEV("http://api.dev.endpoint.com");


    public String endpoint;

    Build(String endpoint){
        this.endpoint = endpoint;
    }
  }
}

我有一个接受构建类型的 ApiModule,所以我像这样实例化组件:

ApiComponent component = DaggerApiComponent.builder()
            .apiModule(new ApiModule(ApiConfig.Build.DEV))
            .build();

所以,现在如果我想更改端点,我将 ApiConfig.Build.DEV 更改为 ApiConfig.Build.STAGE 或 ApiConfig.Build.RELEASE。这是解决这个问题的正确方法吗?最终,我希望能够按一个按钮在三者之间切换。

【问题讨论】:

    标签: java android retrofit dagger dagger-2


    【解决方案1】:

    这就是我的工作:

    我有一个基于 Internet 示例的服务工厂类。请看下面的代码。

    当我需要创建我调用的服务实例时。

    service = ServiceFactory.createRetrofitService(GithubService.class,
                GithubService.SERVICE_ENDPOINT);
    

    因此,如果您将 3 个端点添加到 GithubService 接口。在所需视图的单击事件中,只需使用所需的 SERVICE_ENDPOINT 调用 ServiceFactory。

    例子。

    public interface GithubService {
        String RELEASE_ENDPOINT = "https://api.endpoint.com";
        String STAGE_ENDPOINT = "http://api.stage.endpoint.com";
        String DEV_ENDPOINT = "http://api.stage.endpoint.com";
    
        @GET("/users/{login}")
        Observable<UserResponse> getUser(@Path("login") String login);
    }
    

    在您的 RELEASE 按钮 onClick() 调用中:

    private GithubService service;
    
    service = ServiceFactory.createRetrofitService(GithubService.class,
                GithubService.SERVICE_ENDPOINT);
    

    在您的 STAGE 按钮 onClick() 调用中:

    private GithubService service;
    
    service = ServiceFactory.createRetrofitService(GithubService.class,
                GithubService.STAGE_ENDPOINT);
    

    在您的 DEV 按钮 onClick() 调用中:

    private GithubService service;
    
    service = ServiceFactory.createRetrofitService(GithubService.class,
                GithubService.DEV_ENDPOINT);
    

    服务工厂代码:

    public class ServiceFactory {
    
        private static final String TAG = ServiceFactory.class.getSimpleName();
        /**
         * Creates a retrofit service from an arbitrary class (clazz)
         * @param clazz Java interface of the retrofit service
         * @param endPoint REST endpoint url
         * @return retrofit service with defined endpoint
         */
        public static <T> T createRetrofitService(final Class<T> clazz, final String     endPoint) {
            final RestAdapter restAdapter = new RestAdapter.Builder()
                    .setLogLevel(RestAdapter.LogLevel.FULL)
                    .setLog(new RestAdapter.Log() {
                        @Override
                        public void log(String message) {
                            Log.v(TAG, message);
                        }
                    })
                    .setEndpoint(endPoint)
                    .build();
            T service = restAdapter.create(clazz);
    
            return service;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多