Как я могу изменить URL-адрес модификации во время выполнения

Мне нужно изменить базу URL-адресов при модернизации, я использую koin для создания модуля модернизации при запуске приложения, и я хочу изменить этот URL-адрес во время выполнения.

Я уже пробовал изменить baseUrl ("http://192.168.192.168/") на baseUrl ("http: / / ") и измените URL-адрес при вызове модернизации, но мое приложение вылетает и возвращает ошибку недопустимого URL-адреса.

Создавать конструктора - это мое развлечение

fun createRetrofit(okHttpClient: OkHttpClient): Retrofit {
    return  Retrofit.Builder()
    .baseUrl("http://192.168.192.168/")//i need change this at runtime
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}

создать bean-компонент для моего модуля

val retrofitModule: Module = applicationContext {
    bean { createRetrofit(get()) }
}

и запускаем коин:

startKoin(application = this,
  modules = listOf(retrofitModule, ...)
)

кто-нибудь могу мне помочь с этим?


person Marcello Sousa    schedule 26.03.2019    source источник


Ответы (2)


вам необходимо добавить эти строки в свой код:

Первый шаг: добавьте новый CallAdapter RxJavaCallAdapterFactory.create () при создании экземпляра Retrofit.

public static final String BASE_URL = "http://google.com/";
public static Retrofit getClient(String baseUrl) {
    if (retrofit==null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}

Следующий шаг: обновите метод APIService, например: -> savePost (String title, String body, String userId), чтобы он стал Observable.

public interface APIService {
    @GET
    Call<ResponseBody> list(@Url String url);
//or

@POST("/posts")
@FormUrlEncoded
Observable<Post> savePost(@Field("title") String title,
                          @Field("body") String body,
                          @Field("userId") long userId);
}

Последний шаг: при выполнении запросов наш анонимный подписчик отвечает на поток наблюдаемого объекта, который генерирует событие.

public void sendPost(String title, String body) {

    // RxJava
    mAPIService.savePost(title, body, 1).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<Post>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(Post post) {
                    showResponse(post.toString());
                }
            });
}

таким образом вы создаете свои динамические URL: хотите узнать больше подробностей ссылка на полное описание: Отправка данных с помощью HTTP-клиента Retrofit 2 для Android

и См. базовый URL для получения подробной информации о том, как значение будет сопоставлено с базовым URL-адресом для создания полного URL-адреса конечной точки.

если вы используете kotlin: перейдите по этой ссылке. динамические URL-адреса во время выполнения с Модернизация 2

person Horrorgoogle    schedule 26.03.2019

Я уже пробовал изменить baseUrl ("http://192.168.192.168/") на baseUrl ("http: / / ") и измените URL-адрес при вызове модернизации, но мое приложение вылетает и возвращает ошибку недопустимого URL-адреса.

Вы можете оставить его как baseUrl, если вы используете @URL, он перезапишет тот, который на вас Retrofit.Builder()

Вы можете использовать параметр @URL для динамического изменения конечной точки.

@GET
fun getUsers(@Url String url) : Observable<UserResponse>
person Skizo-ozᴉʞS    schedule 26.03.2019