Kotlin - retrofit oddaje pusta liste po zapytaniu

0

Cześć,

Mam program, ktory wysyla zapytanie postem do API a nastepnie chcialbym utworzyc liste z wszystkimi danymi, ktore dostane w odpowiedzi, ale w momencie gdy wywoluje zapytanie do API to przy pierwszym wywolaniu dostaje pusta odpowiedz a w momencie gdy jeszcze raz ja odpale to zaczyna juz smigac. Czym jest to spowodowane?

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val api = ApiConnection()

        button_checkIfThisAccountExit_mainActivity.setOnClickListener {
            api.loginRequest(editText_login_activityMain.text.toString(), editText_password_mainActivity.text.toString())
            Log.v("parser", "result: " + api.data.size)
        }
    }
}
class ApiConnection {

    var baseApiURl = "http://localhost"
    var data = arrayListOf<User>()

    fun connectApi(): ApiService {
        Log.v("parser", "connectApi")
        val retrofit = Retrofit.Builder()
            .baseUrl(baseApiURl)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        return retrofit.create(ApiService::class.java)

    }

    fun loginRequest(login: String, password: String): ArrayList<User>{

        Log.v("parser", "loginRequest")
        val service = connectApi()
        val call = service.login(login, password)
        call.enqueue(object: Callback<UserResponse> {
            override fun onFailure(call: Call<UserResponse>?, t: Throwable?) {
                Log.v("retrofit", "call failed")
            }

            override fun onResponse(call: Call<UserResponse>?, response: Response<UserResponse>?) {
                data.add(
                    User(
                        response!!.body()!!.idUser,
                        response!!.body()!!.login,
                        response!!.body()!!.password,
                        response!!.body()!!.name,
                        response!!.body()!!.surname,
                        response!!.body()!!.lastLogin
                    )
                )
            }
        })
        return data
    }
}

W momencie gdy po nacisnieciu przycisku i wywolaniu metody zapytania dlugosc listy jest rowna 0, ale gdy ponownie nacisne przycisk to zostaje dodane to co mialo byc dodane przy pierwszym wywolaniu tzn. jak naciskam to powinna byc lista rowna 1 a dostaje 0, nastepnie naciskajac znow dostaje liste rowna 1 zamiast rowna 2.
Czy jest to spowodowana biblioteka retrofit?

0

Jest to spowodowane tym, że kod w onResponse wykonuje się praktycznie zawsze po Log.v("parser", "result: " + api.data.size). Dzieje się tak, ponieważ klient HTTP, z którego korzysta Retrofit, wykonuje zapytanie na innym wątku niż główny wątek aplikacji i dopiero po jakimś czasie dostarcza odpowiedź na głównym wątku do obiektu przekazanego w enqueue().

1 użytkowników online, w tym zalogowanych: 0, gości: 1