我正在使用 JSoup 来解析网站(我必须将其设置为使用明文请求,因为不支持 https)。它是为了Runnable
避免阻塞主网络线程。但是,当我运行代码时它似乎没有显示。我怀疑这与(因为我在设置它时遇到问题)有关activity
,并且我正在使用内部类,但没有返回错误或警告。我究竟做错了什么?
package com.example.investmenthuntermobile
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TableRow
import android.widget.TextView
import androidx.fragment.app.Fragment
import com.example.investmenthuntermobile.databinding.InsiderFragmentBinding
import org.jsoup.Jsoup
class InsiderFragment : Fragment() {
private lateinit var binding: InsiderFragmentBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = InsiderFragmentBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupData()
//val jsonData = finraGetBondInfo("Boeing")
}
private fun setupData() {
val thread = Thread(Task()).start()
}
inner class Task() : Runnable {
override fun run() {
val doc = Jsoup.connect("http://openinsider.com/search?q=GME").get()
val table = doc.select(".tinytable")
// Get the table header cells
val tableHeaderRow = TableRow(activity)
tableHeaderRow.isClickable = true
table.select("thead").select("tr").forEach {row ->
row.getElementsByTag("th").forEach { cell ->
Log.d("CELL text", cell.text())
val textView = TextView(activity)
textView.text = cell.text()
tableHeaderRow.addView(textView)
}
}
// Get the table body cells
table.select("tbody").select("tr").forEach {row ->
val tableRow = TableRow(requireActivity())
tableRow.isClickable = true
row.getElementsByTag("td").forEach { cell ->
val textView = TextView(activity)
textView.text = cell.text()
tableRow.addView(textView)
}
}
}
}
}
您的 run() 方法当前通过创建 TextView 元素并将它们添加到表行来更新 UI。UI 更新应始终在主线程上执行。您可以使用 runOnUiThread() 方法在主线程上执行更新 UI 的代码。
这不是我实现它的方式,但如果你想要快速修复,你应该使用下面的代码:
按照 @snachmsm 所说,我更新了代码以使用异步代码而不是可运行代码。我将获取数据和绘制 UI 分开,这样更有意义。
openinsiderGetData()
这是您如何使用协程在后台线程上正确完成工作的方法。