У меня проблема с программированием Android в Kotlin.
У меня почти болотный стандарт LoginActivity
от Android Studio.Внутреннему классу предоставляется AsyncTask
для выполнения действия входа в отдельном потоке, чтобы приложение перестало отвечать на запросы.
Моя проблема в том, что когда я пишу свой код входа в AsyncTask
и предоставляюрезультирующий вывод putExtra()
функции Intent
, результирующий Intent
не имеет никакой информации внутри себя.Вместо этого я всегда получаю NullPointerException
при попытке доступа к данным из нового действия.
Мой код выглядит следующим образом:
// Inner AsyncTask class from LoginActivity
inner class UserLoginAsync constructor(var mSid: String, var mUsername: String, var mPassword: String): AsyncTask<Void, Void, String>() {
var data: String? = ""
override fun doInBackground(vararg params: Void?): String {
// Run request with OkHttp.
}
override fun onPostExecute(result: String) {
showProgress(false)
if(data != "") {
val intent: Intent = Intent(this@LoginActivity, HomeActivity::class.java).apply {
putExtra("data", data)
}
startActivity(intent)
finish()
} else {
password.error = getString(R.string.error_incorrect_password)
password.requestFocus()
}
}
}
Если я переписываю код без AsyncTask,
он работает просто отлично, но в процессе работы зависает поток пользовательского интерфейса и не предоставляет пользователю графическую обратную связь во время выполнения запроса.
Как бы я написал Intent
, чтобы он обеспечивал новую активностьс необходимыми данными?
Редактировать По запросу, здесь код из HomeActivity
:
class HomeActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
val keyname: String = "data"
val data: JSONObject = JSONObject(intent.getStringExtra(keyname))
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
setSupportActionBar(toolbar)
userName.text = data.getJSONObject("student").getString("name")
userEmail.text = data.getJSONObject("student").getString("email")
fab.setOnClickListener { view ->
Snackbar.make(view, "You tapped the fab! Good job!", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
val toggle = ActionBarDrawerToggle(this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
drawer_layout.addDrawerListener(toggle)
toggle.syncState()
nav_view.setNavigationItemSelectedListener(this)
}
}