Тост не отображается в потоке входа в систему при вызове HTTP-запроса - PullRequest
3 голосов
/ 03 июля 2019

На странице входа в мое приложение у меня есть поля электронной почты и пароль и кнопка входа.

Кнопка сначала получает имя пользователя и пароль, затем создает тост, а затем вызывает отдельный файл kotlin, чтобы сделатьhttp запрос с данными для входа.

Странная вещь: если учетные данные неверны, появляется тост, но когда учетные данные верны и сервер отвечает данными, которые тост никогда не показывает.

Однако я понимаю, что порядок выполнения должен быть таким, чтобы тост отображался до вызова http.

btn_signin.setOnClickListener(){
    val username = et_username.text.toString().trim()
    val password = et_password.text.toString().trim()
    var toast_text = "Signing you in..."
    Toast.makeText(this@LoginActivity, toast_text, Toast.LENGTH_LONG).show()
    val resp = Punchcard().Login(username = username, password = password)
}

Попытался изменить длину на короткую без разницы.Конечно, это должно отображаться независимо от следующего кода?

РЕДАКТИРОВАТЬ:

Это в файле LoginActivity.kt, я немного отредактировал приведенный выше код.

Другой отдельный файл(Punchcard.kt) обрабатывает вызов API на сервере, который все работает нормально и не вызывает никаких проблем.Теоретически это не должно иметь ничего общего с Toast, просто странно, что обработка в отдельном файле, похоже, отнимает у него создание.Неужели я схожу с ума от того, что они должны быть связаны между собой, а поток отображения Android должен быть построчным?

EDIT2:

Это функция входа в систему Punchcard.kt, которая выполняет вызов okhttp3 API ивозвращает ответ в виде строки.Прежде, чем это упомянуто, я знаю, что я не должен передавать строку пароля, это - недостаток в API, который я использую, но будет обновлен в будущем.Также, как упоминалось выше, это не должно иметь никакого эффекта, так как тост вызывается перед функцией входа в систему.

fun Login(username : String, password : String): String {
    val url: String = "http://192.168.8.200:3001/api/auth/signin"
    val json = JSONObject()
    json.put("usernameOrEmail", username)
    json.put("password", password)
    val body: RequestBody = RequestBody.create(JSON, json.toString())
    val request = Request.Builder()
        .url(url)
        .post(body)
        .build()
    val policy : StrictMode.ThreadPolicy  = StrictMode.ThreadPolicy.Builder().permitAll().build()
    StrictMode.setThreadPolicy(policy)
    try {
        var response: Response = client.newCall(request).execute()
        return response.body()?.string() ?: "error"
    } catch (e : Exception) {
        println(e)
    }
    return "error"
}

Ответы [ 3 ]

1 голос
/ 03 июля 2019
 Toast.makeText(applicationContext,toast_text,Toast.LENGTH_SHORT).show()   

Это работает.Используйте это один раз.

0 голосов
/ 16 июля 2019

Достигнут желаемого результата, перейдя к использованию асинхронного вызова в фоновом потоке.До сих пор не объясняет, почему тост не отображается до звонка, однако в моем проекте это больше не проблема.Кажется, что Рахул предложил то, что я уже сделал, чтобы решить эту проблему, в комментариях, так что хорошая карма для него.Если у кого-то есть реальное объяснение, почему это происходит, мне все равно было бы интересно узнать.

0 голосов
/ 03 июля 2019

1) Предположим, ваш тост находится в Activity и в подклассе, чем код ниже:

Toast.makeText(this, "Hi there! This is a Toast.", Toast.LENGTH_LONG).show()

или

Toast.makeText(applicationContext, "Test", Toast.LENGTH_LONG).show()

2) Фрагмент:

Toast.makeText(activity, "Test", Toast.LENGTH_LONG).show()

3) Используя метод:

fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
  Toast.makeText(this, message, duration).show()
}

class MainActivity : Activity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        toast("Hello, Kotlin!")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...