Retrofit отправляет несколько запросов
Отправляю запросы через Retrofit. Проблема в том что с каждым последующим нажатием кнопки отправляются несколько запросов(1,3,4,5...). При смене активити сбрасывается до 1. Как сделать чтобы был 1?
object Retrofitinstance {
private val retrofit by lazy {
val okHttpClient = OkHttpClient().newBuilder()
.connectTimeout(180, TimeUnit.SECONDS)
.readTimeout(180, TimeUnit.SECONDS)
.writeTimeout(180, TimeUnit.SECONDS)
.build()
Retrofit.Builder()
.baseUrl(base_url)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
val api: SimpleApi by lazy {
retrofit.create(SimpleApi::class.java)
}
}
.
interface SimpleApi {
@POST("/sdapi/v1/preprocess")
suspend fun pushPostPreproc(
@Body post: preprocess
): Response<preprocess>
}
.
class MainViewModel(private val repository: Repository): ViewModel(){
var myResponsePreproc: MutableLiveData<Response<preprocess>> = MutableLiveData()
fun pushPostPreproc(post: preprocess){
viewModelScope.launch {
val response: Response<preprocess> = repository.pushPostPreproc(post)
myResponsePreproc.value = response
}
}
}
.
class Repository {
suspend fun pushPostPreproc(post: preprocess): Response<preprocess>{
return Retrofitinstance.api.pushPostPreproc(post)
}
}
.
class MainViewModelFactory(
private val repository: Repository
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return MainViewModel(repository) as T
}
}
.
binding2.createHyperBtn.setOnClickListener {
println("preprocess start")
val repository = Repository()
val vieModelFactory = MainViewModelFactory(repository)
val myPostPreproc = preprocess(1, "images/$name","images/$name/out", 512, 512, "ignore", false, false, true)
viewModel = ViewModelProvider(this, vieModelFactory).get(MainViewModel::class.java)
viewModel.pushPostPreproc(myPostPreproc)
viewModel.myResponsePreproc.observe(this, Observer { response ->
if(response.isSuccessful){
Log.d("Preprocess succesfull ", response.code().toString())
} else{
Log.d("Preprocess ERR", response.toString())
}})
Log
I/System.out: preprocess start
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
I/System.out: preprocess start
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
I/System.out: preprocess start
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
I/System.out: preprocess start
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
D/Preprocess ERR: Response{protocol=h2, code=404, message=, url=https://proud-pants-return-34-142-188-215.loca.lt/sdapi/v1/preprocess}
Ответы (1 шт):
Автор решения: dDoS
→ Ссылка
Можешь решить эту проблему добавив отмену предыдущих запросов перед созданием нового нужно сохранять ссылку на объект запроса Retrofit и вызывать метод cancel() для отмены предыдущего запроса перед созданием нового.
class MyActivity : AppCompatActivity() {
private var call: Call<MyResponse>? = null // сохраняем ссылку на объект запроса
fun makeRequest() {
call?.cancel() // отменяем предыдущий запрос
val api = Retrofit.Builder()
.baseUrl("https://example.com")
.build()
.create(MyApi::class.java)
call = api.getMyData()
call?.enqueue(object : Callback<MyResponse> {
override fun onResponse(call: Call<MyResponse>, response: Response<MyResponse>) {
// обработка ответа
}
override fun onFailure(call: Call<MyResponse>, t: Throwable) {
// обработка ошибки
}
})
}
}