user9178453
user9178453

Reputation:

How to change a global variable from a anonymous class implementation in kotlin

fun loadTweets(uid: Int) : Observable<ArrayList<Tweet>> {
    var tweets: ArrayList<Tweet> = ArrayList<Tweet>()

    val builder: Retrofit.Builder = Retrofit.Builder()
            .baseUrl(NetworkContract.SERVER_URL)
            .addConverterFactory(GsonConverterFactory.create())
    val retrofit: Retrofit = builder.build()

    val userService: UserService = retrofit.create(UserService::class.java)

    val call: Call<List<Tweet>> = userService.loadTweets(uid)

    call.enqueue(object: Callback<List<Tweet>>{
        override fun onResponse(call: Call<List<Tweet>>?, response: Response<List<Tweet>>?) {
            if(response!!.isSuccessful){
                val tweetsTemp: ArrayList<Tweet> = ArrayList<Tweet>()

                tweetsTemp.add(Tweet("Test!", "Tom"))
                mTweets = tweetsTemp
            }
        }
        override fun onFailure(call: Call<List<Tweet>>?, t: Throwable?) {
        }

    })

    return Observable.just(this.mTweets)
}

Hey guys, I want to create a Twitter Clone but I can't return the changed mTweets variable. I get a response from my server and in the onResponse method mTweets is changed but my function does return an empty string.(Btw. tweetsTemp is just for testing. I will change this later).

Upvotes: 0

Views: 500

Answers (1)

jossiwolf
jossiwolf

Reputation: 2175

You can't return mTweets because the network call is running asynchronically.

Read more about synchronous and asynchronous requests here: https://futurestud.io/tutorials/retrofit-synchronous-and-asynchronous-requests

Upvotes: 1

Related Questions