Kotlin - функция запускается после окончания следующих строк - PullRequest
0 голосов
/ 14 мая 2019

Обновлено - код в вопросе теперь работает

Я пытаюсь запустить функцию после нажатия на кнопку. Функция обновляет массив, и я хочу запустить следующие строки (Следующие строки переносят меня в другое действие), если массив не пустой.

Я пытался открыть новое действие в функции filterPlaces, но безуспешно, startActivity и Intent не работают.

Это функция, которая обновляет массив:

var places = ArrayList<Place>() //Global place array
class MainActivity : AppCompatActivity() {

    fun filterPlaces(types: ArrayList<String>, foods: ArrayList<String>, maxPrice: Int, maxProximity: Int) {
        var typesList = types
        val foodList = foods
        if (types.isEmpty()) {
            typesList = arrayListOf("Restaurant", "Hangouts")
            if (foods.isEmpty()) {
                foodList.add("Pizza")
            }
        }
        val db = FirebaseFirestore.getInstance()
        db.collection("places").get().addOnSuccessListener { result ->
            for (document in result) {
                val typeMatches = document.data["Type"].toString() in typesList
                val foodMatches = document.data["Food"].toString() in foodList
                var price = 0
                when (document.data["Price"].toString()) {
                    "Very cheap" -> price = 0
                    "Cheap" -> price = 1
                    "Average" -> price = 2
                    "Far" -> price = 3
                    "Very far" -> price = 4
                }
                val priceMatches = price <= maxPrice
                var proximity = 0
                when (document.data["Proximity"].toString()) {
                    "Very close" -> proximity = 0
                    "Close" -> proximity = 1
                    "Far" -> proximity = 2
                    "Very far" -> proximity = 3
                }
                val proximityMatches = proximity <= maxProximity
                if (typeMatches and foodMatches and priceMatches and proximityMatches) {
                    val place = Place(
                        document.data["Place"].toString(),
                        document.data["Type"].toString(),
                        document.data["Food"].toString(),
                        document.data["Price"].toString(),
                        document.data["Proximity"].toString()
                    )
                    places.add(place)
                    Log.d("name", "Place added successfully")
                }
            }

            //Openning the results activity
            if (places.isNotEmpty()) {
                val i = Intent(this, RelevantPlaces::class.java)
                val b = Bundle()
                b.putParcelableArrayList("places", places)
                i.putExtra("bundle", b)
                startActivity(i)
            }
        }
            .addOnFailureListener { exception ->
                Log.d("name", "Error getting documents.")
            }
    }

Это функция нажатия:

fun onSortFilterClicked(view: View) {
        if (places.isEmpty()) filterPlaces(types, foods, priceRange.progress, proximityRange.progress)
    }

Сначала я хочу запустить filterPlaces, обновлять массив places, пока я его запускаю, и только потом проверять, является ли массив все еще пустым, и если нет, открыть новое действие. На самом деле происходит то, что он вызывает filterPlaces, но не делает этого, вместо этого он проверяет массив places (if condition в коде) и только затем входит в filterPlaces и запускает то, что в нем, у меня нужно дважды нажать на кнопку и только у массива есть значения. Я запускаю это на Android Studio, и я новичок в этом мире Kotlin и разработке Android в целом.

Есть ли решение для этого? Либо открыть действие внутри функции, либо запустить ее сначала?

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Что происходит?

Асинхронный запрос выполняется в filterPlaces, поэтому сам метод немедленно возвращается и передает управление следующему блоку кода.

Как это исправить?

Переместите свой код, начиная с другого Activity, в область действия вашего успешного слушателя.Лучший подход - поместить этот код в отдельный метод и просто вызывать его по мере необходимости.

0 голосов
/ 14 мая 2019

Поместил функцию filterPlace вне класса Main Activity. Переместил функцию в класс Main Activity и она заработала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...