doAsyn c не работает в классе Fragment - PullRequest
0 голосов
/ 03 марта 2020

Я использую Kotlin язык для приложения android, которое я создаю, и я использую doAsyn c для получения данных из JSON.

Сначала я сделал это в MainActivity, который расширяет AppCompatibility() и это сработало, но теперь я также должен получить некоторые данные из другого JSON в другом классе, который расширяет Fragment() и, очевидно, он не работает, потому что он не входит в метод Asyn c при отладке приложение.

Вот мой код:

class CreatePayment : Fragment(), View.OnClickListener {
    lateinit var rootView: View
    lateinit var bEndDay: Button
    lateinit var bEndMonth: Button
    lateinit var bEndYear: Button
    private val ipServer = "http://192.168.1.38"
    private val key = "my_key"
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        rootView = inflater.inflate(R.layout.fragment_create_payment, container, false)
        return rootView
    }
    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        bEndDay = rootView.findViewById(R.id.bEndDay)
        bEndDay.setOnClickListener(this)
        bEndMonth = rootView.findViewById(R.id.bEndMonth)
        bEndMonth.setOnClickListener(this)
        bEndYear = rootView.findViewById(R.id.bEndYear)
        bEndYear.setOnClickListener(this)
        getFrmTexts()
    }
    private fun getFrmTexts() {
        doAsync {
            val result = URL(ipServer + ":3001/api/users?key=" + key).readText()
            uiThread {
                val jsonArray = JSONArray(result) //never enters here
                for (i in 0 until jsonArray.length()) {
                    val jsonObject = jsonArray.getJSONObject(i)
                }
            }
        }
    }
}
class MainActivity : AppCompatActivity() {
    private val ipServer = "http://192.168.56.1"
    private val key = "my_key"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val etLoginUser = findViewById<EditText>(R.id.etLoginUser)
        val etLoginPassword = findViewById<EditText>(R.id.etLoginPasword)
        val bLogin = findViewById<Button>(R.id.bLogin)
        bLogin.setOnClickListener {
            val password = encryptPassword(etLoginPassword.text.toString())
            checkLogin(etLoginUser.text.toString(), password)

        }
    }
    private fun checkLogin(etUser: String, etPassword: String) {
        doAsync {
            val result = URL(ipServer + ":3001/api/users?key=" + key).readText()
            uiThread {
                val jsonArray = JSONArray(result) //always enters here
                for (i in 0 until jsonArray.length()) {
                    val jsonObject = jsonArray.getJSONObject(i)
                    val user = jsonObject.getString("user")
                    val password = jsonObject.getString("password")
                    if(user == etUser && password == etPassword) {
                        val intent = Intent(this@MainActivity, UserActivity::class.java)
                        startActivity(intent)
                    }
                }
            }
        }
    }
}

Это результат: enter image description here

Как видите, отладчик остановился на разрыве. Однако это не происходит в CreatePayment : Fragment() class:

enter image description here

И да, я уверен, что приложение входит в эту функцию, потому что если я установите точку останова в строке doAsync, отладчик останавливается на этом:

enter image description here

Если я сделаю шаг через:

enter image description here

Почему это происходит?

Работает ли doAsync только в AppCompatibility() классах?

1 Ответ

0 голосов
/ 05 марта 2020

Вызовите метод getFrmTexts() из метода onViewCreated() фрагмента, а не из метода onActivityCreated(). onActivityCreated() вызывается сразу после метода родительского действия onCreate(), поэтому в данный момент фрагмент может даже не иметь готовых представлений. Также uiThread работает по-разному для разных классов.

Дополнительный совет

В идеале настройку пользовательского интерфейса следует выполнять в методе onViewCreated(), когда представление уже доступно. Таким образом, вам также не нужно сохранять переменную rootView в вашем классе фрагмента из onCreateView() метода

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