簡體   English   中英

當離開主線程時,如何才能使一些代碼盡快在主線程上運行?

[英]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”的延遲,則表示這是兩個互斥的事物之一:

  1. 隊列有很多積壓

  2. 主應用程序線程正在忙於執行其他一些代碼

與普通的小部件相比, WebView ,隊列和主應用程序線程之間的關系相當神秘,因為WebView並不是用Java代碼呈現的經典小部件。 因此,我不知道您的Web內容中是否正在發生某些事情可以解釋這一點,或者對於WebView這是否很正常。 您可以嘗試使用更簡單的Web內容進行實驗,看看是否收到類似的延遲,或者延遲是否與您正在呈現的特定Web內容更多地相關。

推來推去,使用HandlerpostAtFrontOfQueue() 但是,正如該方法的JavaDocs所述 ,這很危險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM