Я использую 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)
}
}
}
}
}
}
Это результат:
Как видите, отладчик остановился на разрыве. Однако это не происходит в CreatePayment : Fragment() class
:
И да, я уверен, что приложение входит в эту функцию, потому что если я установите точку останова в строке doAsync
, отладчик останавливается на этом:
Если я сделаю шаг через:
Почему это происходит?
Работает ли doAsync
только в AppCompatibility()
классах?