Как завершить AsyncTask с намерением при передаче дополнительных данных? - PullRequest
0 голосов
/ 14 мая 2018

У меня проблема с программированием 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)
    }
}

1 Ответ

0 голосов
/ 14 мая 2018
 val data: JSONObject = JSONObject(intent.getStringExtra(keyname))

intent (a.k.a., getIntent() в Java) будет аварийно завершать работу здесь. Вы не можете использовать это из инициализатора поля, потому что Activity еще не был правильно инициализирован. Вам нужно подождать до onCreate(), а в идеале после super.onCreate() вызова.

Вы можете попробовать lateinit var data: JSONObject и выполнить инициализацию в onCreate() после вызова super.onCreate().

...