爲什麼AsyncTask
的方法execute(Params...)
如documentation所述在UI線程上調用,即使AsyncTask在internalHandler中使用Looper.getMainLooper()?爲什麼即使AsyncTask在internalHandler中使用Looper.getMainLooper(),也必須在UI線程上調用AsyncTask的execute()方法?
我試圖創建任務,並從後臺線程調用它的執行(參數...),它工作正常。
爲什麼AsyncTask
的方法execute(Params...)
如documentation所述在UI線程上調用,即使AsyncTask在internalHandler中使用Looper.getMainLooper()?爲什麼即使AsyncTask在internalHandler中使用Looper.getMainLooper(),也必須在UI線程上調用AsyncTask的execute()方法?
我試圖創建任務,並從後臺線程調用它的執行(參數...),它工作正常。
爲什麼一定要
AsyncTask
的方法調用execute(Params...)
UI線程上的文檔中所述,即使在的AsyncTask使用internalHandler Looper.getMainLooper()?
爲什麼可以是一個哲學問題,有時...我檢查AsyncTask
代碼爲Android API 25和代碼本身並沒有給我們一個明確的答案。只有開發這個類的人知道原因。
但是,代碼告訴我們的是它可以將來自後臺線程的調用轉發到UI線程,但它不會。所以開發者沒有專業知識去做,或者懶惰,或者想要執行一個模式,或者其他什麼。
我試着創建任務,並從後臺線程調用它的執行(參數...),它工作正常。
注意它的工作原理,但不能保證總能正常工作。多線程編程相當棘手,其調試可能是地獄。
在代碼檢查中,我注意到onPreExecute()
調用是在調用execute(Params...)
的同一個線程中完成的。因此,如果您在後臺線程中調用execute(Params...)
,它將打破onPreExecute()
在UI線程上運行的不變量。
我真的很感激,如果downvoter表達他或她的動機在評論 – nandsito
我upvoted這個答案,特別是最後一部分是相當好的答案的問題。 – Endzeit