2017-01-23 2 views
0

Вот мой класс singleton.Модернизация динамического базового url с использованием одноэлементного класса

public class GetRetrofit { 


static volatile Retrofit retrofit = null; 

public static Retrofit getInstance() { 
    if (retrofit == null) { 
     synchronized (GetRetrofit.class) { 
      if (retrofit == null) { 
       OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); 
       builder.readTimeout(30, TimeUnit.SECONDS); 
       builder.connectTimeout(30, TimeUnit.SECONDS); 

       HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
       interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
       builder.addInterceptor(interceptor); 

       // builder.addInterceptor(new UnauthorisedInterceptor(context)); 
       OkHttpClient client = builder.build(); 

       retrofit = 
         new Retrofit.Builder().baseUrl("DYNAMIC_URL") 
           .client(client).addConverterFactory(GsonConverterFactory.create()).build(); 

       //addConverterFactory(SimpleXmlConverterFactory.create()) 
      } 
     } 
    } 

    return retrofit; 

} 
} 

Я хочу изменить динамический базовый url.

e.g: http://192.168.1.60:8888/property/Apiv1 необходимо изменить этот URL-адрес во время выполнения http://192.168.1.50:8008/inventory/Apiv1.

Как я могу изменить этот два url динамически во время выполнения. Пожалуйста, помогите мне.

ответ

1

Следующий код покажет один из способов изменения базового url модификации во время выполнения, но за счет незначительного нарушения одноэлементного рисунка. Хотя шаблон все еще частично применим. Я объясню это позже.

Проверьте эту измененную версию GetRetrofit.

public class GetRetrofit { 

     static volatile Retrofit retrofit = null; 
     private static String baseUrlString = "http://192.168.1.60:8888/property/Apiv1"; 

     public static void updateBaseUrl(String url){ 
       baseUrlString = url; 

       retrofit = getRetrofitObj(); 
     } 

     public static Retrofit getInstance() { 
       if (retrofit == null) { 
         synchronized (GetRetrofit.class) { 
           if (retrofit == null) { 
             retrofit = getRetrofitObj(); 
           } 
         } 
       } 

       return retrofit; 
     } 

     public static Retrofit getRetrofitObj() { 
       OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); 
       builder.readTimeout(30, TimeUnit.SECONDS); 
       builder.connectTimeout(30, TimeUnit.SECONDS); 

       HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
       interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
       builder.addInterceptor(interceptor); 

       // builder.addInterceptor(new UnauthorisedInterceptor(context)); 
       OkHttpClient client = builder.build(); 

       retrofit = new Retrofit.Builder().baseUrl(baseUrlString) 
         .client(client).addConverterFactory(GsonConverterFactory.create()).build(); 
     } 
} 

Так, GetRetrofit имеет этот baseUrlString, который инициализирует/держит наш динамический URL. Если вам не нужно обновлять базу по умолчанию URL-то вы прекрасно призванием,

Retrofit retrofit = GetRetrofit.getInstance(); 

Но когда нам нужно изменить URL по умолчанию на что-то другое (http://192.168.1.50:8008/inventory/Apiv1, например), нам необходимо обновить наш базовый url.

GetRetrofit.updateBaseUrl("http://192.168.1.50:8008/inventory/Apiv1"); 
Retrofit retrofit = GetRetrofit.getInstance(); // this provides new retrofit instance with given url 

Это создает новый экземпляр retrofit на основе этого нового URL только при обновлении URL. До тех пор, пока вы не должны обновить базовый URL, вы можете получить экземпляр одноплодного модифицированного просто позвонив по телефону,

Retrofit retrofit = GetRetrofit.getInstance(); 

Таким образом, в некотором смысле это частично сохраняет черту одноплодной шаблон.

Надеюсь, это поможет.

Смежные вопросы