如何在Kotlin中等待OnCompleteListener?

时间:2018-09-04 13:47:51

标签: android firebase kotlin google-cloud-firestore

我调用getFavorite方法从Activity中的数据库类获取数据。但这并不等待onCompleteListener。因此,该列表为空。我该怎么办?

GetMovieActivity.java

    private fun getPhotoListFromApi() {
    val apiService = ApiClient.getRetrofitInstance().create(ApiService::class.java)

    var list = ArrayList<MovieDetailsResponse>()
    var db = Database()
    db.getFavorite()

    for (id in db.moviesID)
    {
        apiService.getMovieDetails(
                id.toString().toInt(),
                "922df43f1a304aca901feb9728b01943",
                Locale.getDefault().language + "-" + Locale.getDefault().country)
                .enqueue(object : Callback<MovieDetailsResponse> {

                    override fun onFailure(call: Call<MovieDetailsResponse>, t: Throwable) {
                    }

                    override fun onResponse(call: Call<MovieDetailsResponse>, response: Response<MovieDetailsResponse>) {
                        response.body()?.let { it ->

                            list.add(it)
                        }

                    }

                })

    }
    adapter.setList((list as List<MovieListItem>?)!!)

}

Database.kt

    fun getFavorite()
{
   val dr = db.collection("Favorites").document(mAuth!!.uid) as DocumentReference
    dr.get().addOnCompleteListener { task: Task<DocumentSnapshot> ->
        if(task.isSuccessful)
        {
            moviesMap = task.result.data!!
            moviesID = moviesMap.get("movies") as ArrayList<Any>
        }
    }

}

1 个答案:

答案 0 :(得分:0)

在您的适配器中,您需要始终发送新列表并通过调用notifyDataSetChange()刷新适配器 一旦回调完成,您就可以使用liveData将数据发布到它并进行监听,然后将新数据推送到适配器并刷新它,以确保您始终拥有正确的最新数据,并且可以使用rxJava来完成确保您正在后台线程中工作,一旦完成,将其推入ui线程并更新适配器