Не обрабатывать ошибки подключения к Интернету до модернизации 2.6 с сопрограммами Kotlin - PullRequest
0 голосов
/ 22 июня 2019

Я использую модификацию 2.6 с сопрограммами kotlin для вызова API без блокировки потока пользовательского интерфейса, у меня все работает, но приложение вылетает, когда я отключаю интернет-соединение. Ошибка logcat: E / AndroidRuntime: ФАКТИЧЕСКОЕ ИСКЛЮЧЕНИЕ: DefaultDispatcher-worker-1

Вот мой код:

private fun handleIntent(slug: String) {
    val service = UtilityMethods.migrationTimeService()

    UtilityMethods.showView(loading_view)
    UtilityMethods.hideView(network_error_msg)

    CoroutineScope(Dispatchers.IO).launch {
        val res = service.getPostBySlug(slug)

            try {
                withContext(Dispatchers.Main) {

                    //Do something with response e.g show to the UI.
                    val post = res.body()!!.first()

                    UtilityMethods.hideView(loading_view)

                    val title = post.title?.rendered
                    val content = post.content?.rendered
                    val imageUrl = post.jetPackFeaturedMediaUrl

                    title_txtView.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                        Html.fromHtml(title, Html.FROM_HTML_MODE_COMPACT).toString()
                    else
                        Html.fromHtml(title).toString()

                    content_txtView.loadData(content.toString(), "text/html", "UTF-8")

                    Picasso.get().load(imageUrl).fit().centerCrop().into(thumbnail_imgview)
                }

            } catch (e: HttpException) {
                UtilityMethods.showView(network_error_msg)
            } catch (e: Throwable) {
                Toast.makeText(this@PostContentActivity, "Ooops: Something else went wrong", Toast.LENGTH_LONG)
            }
    }
}

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

У меня работает код, новый код:

private fun handleIntent(slug: String) = GlobalScope.launch(Dispatchers.Main) {
    val service = UtilityMethods.migrationTimeService()

    UtilityMethods.showView(loading_view)
    UtilityMethods.hideView(network_error_msg)

    try {
        val res = withContext(Dispatchers.IO) {
            service.getPostBySlug(slug)
        }

        //Do something with response e.g show to the UI.
        val post = res.body()!!.first()

        UtilityMethods.hideView(loading_view)

        val title = post.title?.rendered
        val content = post.content?.rendered
        val imageUrl = post.jetPackFeaturedMediaUrl

        title_txtView.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
            Html.fromHtml(title, Html.FROM_HTML_MODE_COMPACT).toString()
        else
            Html.fromHtml(title).toString()

        content_txtView.loadData(content.toString(), "text/html", "UTF-8")

        Picasso.get().load(imageUrl).fit().centerCrop().into(thumbnail_imgview)
    }
    catch (e: HttpException) {
        Toast.makeText(this@PostContentActivity, "Exception ${e.message}", Toast.LENGTH_LONG).show()
    }catch (e: IOException) {
        UtilityMethods.hideView(loading_view)
        UtilityMethods.showView(network_error_msg)
    } catch (e: Throwable) {
        Toast.makeText(this@PostContentActivity, "Ooops: Something else went wrong ${e.message}", Toast.LENGTH_LONG).show()
    }
}
0 голосов
/ 22 июня 2019

Вместо этого:

    CoroutineScope(Dispatchers.IO).launch {
    val res = service.getPostBySlug(slug)

        try {
            withContext(Dispatchers.Main) {

Попробуйте это:

    CoroutineScope(Dispatchers.Main).launch {
    val res = service.getPostBySlug(slug)

        withContext(Dispatchers.IO) {
            try {

оберните свой блочный код 'try and catch' в Dispatchers.IO вместо того, чтобы обернуть ваш Dispatchers.IOв блоке yout Try

...