如何在传递额外数据时使用 Intent 完成 AsyncTask?
How to finish AsyncTask with Intent while passing extra data?
我在使用 Kotlin 进行 Android 编程时遇到问题。
我有一个来自 Android Studio 的接近沼泽标准的 LoginActivity
。内部 class 与 AsyncTask
一起提供,以在单独的线程中完成登录操作,以防止应用程序变得无响应。
我的问题是,当我在 AsyncTask
中编写登录代码并将结果输出提供给 Intent
的 putExtra()
函数时,结果 Intent
本身没有 any 信息。相反,当我尝试从新 activity.
访问数据时,我总是得到 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,
的情况下重写代码,它工作得很好,但在运行时挂起 UI 线程,并且在发出请求的过程中不向用户提供图形反馈。
我该如何编写 Intent
以便它为新的 activity 提供所需的数据?
编辑 根据要求,这是来自 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)
}
}
val data: JSONObject = JSONObject(intent.getStringExtra(keyname))
intent
(a.k.a., Java 中的 getIntent()
) 会在这里崩溃。您不能从字段初始值设定项中使用它,因为 Activity
尚未正确初始化。您必须等到 onCreate()
,最好是在 super.onCreate()
调用之后。
您可以尝试 lateinit var data: JSONObject
,并在 super.onCreate()
调用后在 onCreate()
中进行初始化。
我在使用 Kotlin 进行 Android 编程时遇到问题。
我有一个来自 Android Studio 的接近沼泽标准的 LoginActivity
。内部 class 与 AsyncTask
一起提供,以在单独的线程中完成登录操作,以防止应用程序变得无响应。
我的问题是,当我在 AsyncTask
中编写登录代码并将结果输出提供给 Intent
的 putExtra()
函数时,结果 Intent
本身没有 any 信息。相反,当我尝试从新 activity.
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,
的情况下重写代码,它工作得很好,但在运行时挂起 UI 线程,并且在发出请求的过程中不向用户提供图形反馈。
我该如何编写 Intent
以便它为新的 activity 提供所需的数据?
编辑 根据要求,这是来自 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)
}
}
val data: JSONObject = JSONObject(intent.getStringExtra(keyname))
intent
(a.k.a., Java 中的 getIntent()
) 会在这里崩溃。您不能从字段初始值设定项中使用它,因为 Activity
尚未正确初始化。您必须等到 onCreate()
,最好是在 super.onCreate()
调用之后。
您可以尝试 lateinit var data: JSONObject
,并在 super.onCreate()
调用后在 onCreate()
中进行初始化。