在这种情况下如何避免NetworkOnMainThreadException?

时间:2019-12-29 14:18:08

标签: kotlin

我有一个功能:

        fun getUpdatedStr(): DoubleArray {
            var Strings : DoubleArray = doubleArrayOf()
            for (i in 0..9) {
                val page = Jsoup.connect("somesite.com").get()
                val table = page.select("table").first().select("td").first()
                Strings += table.text()
                }
            return Strings
        }

这将引发 android.os.NetworkOnMainThreadException 。我的问题是,如果我尝试将此函数放入线程中,则无法返回该值以将其用于其他函数。解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您无法从主线程在Android上进行网络通话。您必须使用辅助线程。

这可以在普通的旧Java线程中完成,也可以在某些“更高级别”的结构中完成,例如AsyncTask,HandlerThread,RxJava,协程等。

通常,您无法从所需的线程中“返回”,因为触发新线程后,执行将继续在主线程上进行。
如果使用协程,则可以使用suspend函数来执行此操作。

如果您不想学习协程,那么使用RxJava必须将一个可观察到的返回给调用函数

否则,将您的方法转换为基于回调的方法,并在完成后调用回调方法