Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何正确地等待HandlerThread启动,然后再进行操作?_Android_Android Handlerthread - Fatal编程技术网

Android 如何正确地等待HandlerThread启动,然后再进行操作?

Android 如何正确地等待HandlerThread启动,然后再进行操作?,android,android-handlerthread,Android,Android Handlerthread,在我的项目中,有时创建的线程启动速度不如它应该的快,这种情况很少发生,但大多数情况下会发生在速度较慢/较旧的手机上 我喜欢我的线 class DBThread(threadName: String) : HandlerThread(threadName) { private var mWorkerHandler: Handler? = null override fun onLooperPrepared() { super.onLooperPrepared()

在我的项目中,有时创建的线程启动速度不如它应该的快,这种情况很少发生,但大多数情况下会发生在速度较慢/较旧的手机上

我喜欢我的线

class DBThread(threadName: String) : HandlerThread(threadName) {

private var mWorkerHandler: Handler? = null

    override fun onLooperPrepared() {
        super.onLooperPrepared()
        mWorkerHandler = Handler(looper)
    }

    fun createTask(task: Runnable) {
        mWorkerHandler?.post(task)
    }
}
当我使用它并调用活动时

//this will handle db queries on background and not on main ui thread
var mDbThread: DBThread = DBThread("dbThread")

//use this to interact to main ui thread from different thread
val mUiHandler = Handler()
var mDb: LocalDatabase? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    mDbThread.start()
    mDb = LocalDatabase.getInstance(this)

    fetchAndSetList()

}

override fun onDestroy() {
    super.onDestroy()

    LocalDatabase.destroyInstance()
    mDbThread.quitSafely()
}


private fun fetchAndSetList(){

    mDbThread.createTask(Runnable {
        val list = getList()
        mUiHandler.post {
            // this sometimes does not trigger
            setList(list)
        }
    })
}
函数setList有时不会在上触发。 所以我做了类似的事情

fun createTask(task: Runnable) {
    if(mWorkerHandler == null ){
        createTask(task)
        return
    }
    mWorkerHandler?.post(task)
}

修改后的操作似乎有效,但我不确定这是否是一种安全的方法。提前谢谢。

我认为mWorkerhandler为null的原因是Thread.start将创建新的VMThread并在VMThread中启动循环器。整个流程都是异步的,因此当实际调用onLooperPrepared时,为时已晚,因为“fetchAndSetList”已经在尝试使用mWorkerHandler

解决方案是在HandlerThread之外创建处理程序:

Handler workerHandler;
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    mDbThread.start()
    workerHandler = new Handler(mDbThread.getLooper());
    mDb = LocalDatabase.getInstance(this)

    fetchAndSetList()
}

private fun fetchAndSetList(){
    workerHandler.post(Runnable {
        val list = getList()
        mUiHandler.post {
            // this sometimes does not trigger
            setList(list)
        }
   })
}

嘿,真的很抱歉很晚才回复,使用你在链接和Zulitim上的答案,我终于理解了流程,是的,在主线程上获得活套是正确的。非常感谢你