如何从 Thread 获取 return 值?

How to return value from Thread?

我想将 arrayList 传递给适配器构造函数。 Arraylist 是 returned 通过查询。查询必须在线程中。我该怎么做?

CostDao.kt

@Dao
interface CostDAO {

    @Query("select * from Cost")
    fun getAll() : List<Cost>

MainActivity.kt



class ComparatorActivity : AppCompatActivity(), OpenDatabase.OpenDatabaseListener {
    private var db: AppDatabase? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        val open = OpenDatabase(this)
        open.setOpenDatabaseListener(this)
        open.load()
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        Threads()


//i need to pass the arraylist
        val adapter = MyAdapter(this, )

        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false)
        recyclerView.adapter = adapter

}
    fun Threads() {
        Thread {
            val List = db!!.costDAO().getAll()
        }.start()
}


我如何 return 从线程列表?然后将其传递给适配器构造函数。

您可以将空列表传递给适配器构造函数,并在从数据库检索数据时调用 adapter.notifydatasetchanged(),但列表必须是同一对象。

class ComparatorActivity : AppCompatActivity(), OpenDatabase.OpenDatabaseListener {
    private var db: AppDatabase? = null
    var list = listOf<Cost>()
    private lateinit var adapter: MyAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        val open = OpenDatabase(this)
        open.setOpenDatabaseListener(this)
        open.load()
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)

        adapter = MyAdapter(this,list)
        Threads()

        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false)
        recyclerView.adapter = adapter
    }
    fun Threads() {
        Thread {
            list = db!!.costDAO().getAll()
            adapter.notifyDataSetChanged()
        }.start()
}

在数据准备好后创建 Adapter 的新实例并将其设置为您的 recyclerView:

Thread {
    val itemsList...// from db
    runOnUiThread {
        recyclerView.adapter = MyAdapter(this, itemsList)
    }
}.start()

您也可以创建一个 setItems 方法(在您的 adapter 中)并以这种方式分配它:

class MyAdapter... {

    private val items = mutableListOf<Cost>()

    fun setItems(items: List<Cost>) {
        this.items.clear()
        this.items.addAll(items)
        notifyDataSetChanged()
    }
}

Thread {
    val itemsList...// from db
    runOnUiThread {
        (recyclerView.adapter as MyAdapter).setItems(itemsList)
    }
}.start()

我还建议使用 AsyncTask 而不是常规 Thread