从位于res / values文件夹的Strings.xml文件中设置Retrofit Base URL

时间:2018-02-12 10:34:24

标签: android retrofit

我需要从Strings.xml文件设置改造基本URL。但是,服务生成器无法访问Android中的Context类。任何人都可以提出任何建议吗?

这是我的代码的快照

private static Retrofit.Builder builder =
        new Retrofit.Builder()
                .baseUrl(API_BASE_URL)
                .baseUrl("http://localhost/")
                .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().setLenient
                        ().create()));

2 个答案:

答案 0 :(得分:0)

不幸的是,您可以访问任何字符串资源的唯一方法是使用上下文(即ActivityService)。我在这种情况下通常做的就是简单地要求调用者传入上下文。

只能在没有上下文的情况下使用系统资源:

Resources.getSystem().getString(android.R.string.somecommonstuff)

尝试以下解决方案

  1. 创建Application的子类,例如公共类App extends Application {
  2. <application>中设置AndroidManifest.xml标记的android:name属性,指向新的类,例如: android:name=".App"
  3. 在您的应用实例的onCreate()方法中,将context(例如this)保存到名为mContext的静态字段中,并创建一个返回此字段的静态方法,例如getContext():
  4. 这应该是它的样子:

    public class App extends Application{
    
        private static Context mContext;
    
        @Override
        public void onCreate() {
            super.onCreate();
            mContext = this;
        }
    
        public static Context getContext(){
            return mContext;
        }
    }
    

    现在,您可以在需要获取上下文时使用:App.getContext(),然后getResources() (or App.getContext().getResources())

    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(API_BASE_URL)
                    .baseUrl(App.getContext().getResources().getString(R.string.YOUR_STRING);)
                    .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().setLenient
                            ().create()));
    

答案 1 :(得分:0)

最好在扩展Application的类中添加Retrofit依赖项。

在这种情况下,您可以通过使用getString()方法设置基本URL并将url存储在strings.xml文件中来轻松实例化您的改造对象。

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(getString(R.string.server_url))
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .client(httpClient)
                .build();