Как изменить Retrofit baseUrl из общих настроек во время выполнения - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь изменить Retrofit baseUrl с SharedPreferences в моем приложении во время выполнения, но изменение вступает в силу только тогда, когда я закрываю и открываю приложение. Я пытался использовать onSharedPreferenceChangeListener () и onPreferenceChangeListener (), но я все еще получаю тот же результат. Как мне реализовать слушателей, чтобы они меняли baseUrl во время выполнения?

    private val moshi = Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()

    private val retrofit = Retrofit.Builder()
        .addConverterFactory(MoshiConverterFactory.create(moshi))
        .addCallAdapterFactory(CoroutineCallAdapterFactory())
        .baseUrl(CompanyApiService .apiBaseUrl)
        .build()

    interface CompanyApiService {
        @GET("employees")
        fun getEmployeesAsync(): Deferred<List<Employees>>

        @GET("title/{id}")
        fun getTitlesAsync(@Path("id") id: Int): Deferred<List<Titles>>

        @POST("message")
        fun submitMessage(@Body message: Message): Call<String>
    }

    object CompanyApi {
        val retrofitService: CompanyApiService by lazy {
        retrofit.create(CompanyApiService ::class.java)
    }

    var apiBaseUrl = ""
    }

MainActivity.kt

    class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener {

    ...

        PreferenceManager.setDefaultValues(this, R.xml.main_preference, false)
        val sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this)
        sharedPrefs.registerOnSharedPreferenceChangeListener(this)

        val apiBaseUrl = sharedPrefs.getString(KEY_PREF_BASE_URL, "")

        CompanyApi.apiBaseUrl = apiBaseUrl!!
    }

    override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
       if (key == KEY_PREF_BASE_URL) {
            val newApiBaseUrl = sharedPreferences?.getString(key, "")
            CompanyApi.apiBaseUrl = newApiBaseUrl!!
       }
    }

Ответы [ 2 ]

1 голос
/ 25 марта 2020

К счастью для вас У Retrofit есть простое решение для этого:

public interface UserManager {  
    @GET
    public Call<ResponseBody> userName(@Url String url);
}

Строка URL должна указывать полный URL, который вы будете использовать sh.

также, проверьте это -> введите описание ссылки здесь

1 голос
/ 24 марта 2020
object CompanyApi {
    val retrofitService: CompanyApiService by lazy {
    retrofit.create(CompanyApiService ::class.java)
}

Это создает синглтон, вам нужно изменить его и воссоздать Api, когда вы изменили base_url, однако я бы не советовал это делать. Создание модифицированного экземпляра занимает много времени, и в дальнейшем вы можете столкнуться с ошибками.

...