[英]When off the main thread, how can I get some code to run on the main thread as quickly as possible?
我有一個部分基於Web的用戶界面(WebView)。 它通過Javascript接口連接到Android UI。 當您點擊WebView中的某個元素時,JavaScript調用將達到Android,Android將在javascript / web線程上收到該調用。 不是UI(主)線程。
它會在1毫秒或更短的時間內到達Android。 沒問題。 但是,由於我現在想更改UI,因此必須切換到UI線程。 (如果您從主線程修改UI,則Android會引發異常)。 我目前在UI線程上使用Handler並調用post() 。
然后在120到300毫秒之間的任何地方調用此代碼(可運行)。 對於UI而言,從用戶的觸摸改變是非常明顯的滯后。
有什么方法可以使一些代碼更快地在UI線程上運行? 這是一些示例代碼:
接口類:
public class JSInterface {
public void test() {
// Arrives here in 1ms after calling AndroidInterface.test(). Arrives n the web thread.
runOnUiThread(new Runnable() {
@Override
public void run() {
// Arrives here 100ms to 300ms after calling AndroidInterface.test(). Arrives on the main (UI) thread.
}
});
}
}
像這樣添加到網絡視圖中:
webview.addJavascriptInterface(new JSInterface(), "AndroidInterface");
在javascript中這樣調用:
AndroidInterface.test();
謝謝!
有什么方法可以使一些代碼更快地在UI線程上運行?
runOnUiThread()
和kin將消息放在主應用程序線程runOnUiThread()
的消息隊列中。 在大多數情況下,主應用程序線程的工作是將消息拉出隊列並進行處理。 但是,主應用程序線程也負責調用大多數回調。
如果您看到“ 120和300 ms”的延遲,則表示這是兩個互斥的事物之一:
隊列有很多積壓
主應用程序線程正在忙於執行其他一些代碼
與普通的小部件相比, WebView
,隊列和主應用程序線程之間的關系相當神秘,因為WebView
並不是用Java代碼呈現的經典小部件。 因此,我不知道您的Web內容中是否正在發生某些事情可以解釋這一點,或者對於WebView
這是否很正常。 您可以嘗試使用更簡單的Web內容進行實驗,看看是否收到類似的延遲,或者延遲是否與您正在呈現的特定Web內容更多地相關。
推來推去,使用Handler
和postAtFrontOfQueue()
。 但是,正如該方法的JavaDocs所述 ,這很危險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.