如何在运行时从共享首选项更改 Retrofit baseUrl
How to change Retrofit baseUrl from shared preferences at runtime
我试图在运行时从我的应用程序中的 SharedPreferences 更改 Retrofit baseUrl,但更改仅在我关闭和打开应用程序时实施。我尝试使用 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!!
}
}
object CompanyApi {
val retrofitService: CompanyApiService by lazy {
retrofit.create(CompanyApiService ::class.java)
}
这会创建一个单例,您需要更改它并在更改 base_url
时重新创建 Api,但我不建议您这样做。创建改造实例非常耗时,稍后您可能会遇到错误。
幸运的是,Retrofit 有一个简单的解决方案:
public interface UserManager {
@GET
public Call<ResponseBody> userName(@Url String url);
}
URL 字符串应指定您希望使用的完整 Url。
另外,检查一下 -> enter link description here
我试图在运行时从我的应用程序中的 SharedPreferences 更改 Retrofit baseUrl,但更改仅在我关闭和打开应用程序时实施。我尝试使用 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!!
}
}
object CompanyApi {
val retrofitService: CompanyApiService by lazy {
retrofit.create(CompanyApiService ::class.java)
}
这会创建一个单例,您需要更改它并在更改 base_url
时重新创建 Api,但我不建议您这样做。创建改造实例非常耗时,稍后您可能会遇到错误。
幸运的是,Retrofit 有一个简单的解决方案:
public interface UserManager {
@GET
public Call<ResponseBody> userName(@Url String url);
}
URL 字符串应指定您希望使用的完整 Url。
另外,检查一下 -> enter link description here