Назад к задачам
Junior — Senior
7

Исправление багов во View‑фрагменте, потоках и работе с LocationManager

Компании, где спрашивали:

Яндекс PayЯндекс Pay
Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Найдите и исправьте ошибки в следующем коде фрагмента на Kotlin. Программа должна показывать количество нажатий, менять текст кнопки и после достижения нужного количества запускать запрос к LocationManager из отдельного потока, однако в текущей реализации нарушены правила жизненного цикла фрагмента и работы с потоками. Предоставьте исправленную версию.

class Frmt(var targetCount: Int) : Fragment() {

    private val contextRef = requireContext()
    private val textView: TextView = requireView().findViewById(R.id.tv)
    private val button: Button = requireView().findViewById(R.id.btn)

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return inflater.inflate(R.layout.asdasd, container, true)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        var clicks = 0
        textView.text = "Для подтверждения операции нажмите далее $targetCount раз"
        button.text = "Нажать"
        button.setOnClickListener {
            if (clicks < targetCount) {
                clicks += 1
            } else {
                Thread {
                    (contextRef.getSystemService(Context.LOCATION_SERVICE) as LocationManager)
                        .requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            500,
                            500f
                        ) {
                            val result = executeRequest(
                                it.latitude,
                                it.longitude
                            )

                            Handler().post {
                                if (result) {
                                    textView.text = "Операция произведена успешно"
                                } else {
                                    throw Exception("Операция произведена с ошибкой, повторите позже")
                                }
                            }
                        }
                }
            }
        }
    }
}