如何在传递额外数据时使用 Intent 完成 AsyncTask?

How to finish AsyncTask with Intent while passing extra data?

我在使用 Kotlin 进行 Android 编程时遇到问题。

我有一个来自 Android Studio 的接近沼泽标准的 LoginActivity。内部 class 与 AsyncTask 一起提供,以在单独的线程中完成登录操作,以防止应用程序变得无响应。

我的问题是,当我在 AsyncTask 中编写登录代码并将结果输出提供给 IntentputExtra() 函数时,结果 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() 中进行初始化。